Как найти строки, начинающиеся с **

Как найти строки, начинающиеся с **

Мне нужно найти строки в файле, начинающиеся с **.

Я не могу понять, как это сделать, потому что *оболочка интерпретирует это как подстановочный знак.

grep -i "^2" test.out

работает, если строка начинается с 2, но

grep -i "^**" test.out 

очевидно, не работает.

(Мне также нужно знать, заканчивается ли эта строка на «a», )но я пока этого не пробовал).

решение1

Используйте \символ для экранирования *, чтобы сделать его обычным символом.

grep '^\*\*' test.out

Также обратите внимание на одинарные кавычки ', а не на двойные, "чтобы оболочка не расширяла данные.

решение2

Так как вы хотели проверить строку, которая начинается с **и заканчивается на ), вы можете объединить две grepоперации следующим образом:

grep '^*\*' test.out | grep ')$'

Или с помощью одной grepкоманды, например, такой:

grep -E '^\*\*.*\)$' test.out

Объяснение

  • ^\*\*: сопоставить строку, которая начинается с**
  • .*: сопоставить все после**
  • \)$: соответствует строке, которая также имеет )в конце строки.

решение3

Это не оболочка.

Ни один из ответов до сих пор не затронул реальную проблему. Было бы полезно объяснитьпочемуэто не работает так, как вы ожидаете.

grep -i "^**" test.out

Потому что у тебя естьцитируетсяшаблон длягрэп, *являетсянетРасширен оболочкой. Он передаетсягрэпкак есть. Это объясняется на странице руководства [1] дляБаш[2] :

Заключение символов в двойные кавычки сохраняет буквальное значение всех символов внутри кавычек, за исключением $, `, \ и, если включено расширение истории, !.

Это обычные обычные регулярные выражения

Регулярное выражение — этошаблонописывающий набор строк.

*является одним из ключевых шаблонов в регулярных выражениях. По умолчанию,грэпинтерпретирует это следующим образом:

* The preceding item will be matched zero or more times.

Это значит, что ваш шаблон в его нынешнем виде ^**не имеет особого смысла. Возможно, он пытается соответствовать началу строкиноль или более раз, дважды. Что бы это ни значило.

Решение состоит в том, чтобыцитироватьэто:

Любой метасимвол со специальным значением можно заключить в кавычки, поставив перед ним обратную косую черту.

grep -i "^\*\*" test.out


[1] Я не рекомендую читать это. man dashВместо этого используйте или похожее.

[2] Никакого снаряда не было, поэтому я предполагаю,Баш.

решение4

Это полностью некавыченная версия: grep ^\\*\\* test.outЧтобы передать буквальный обратный слеш из оболочки в grep, его нужно экранировать.

Это работает до тех пор, пока в каталоге нет файлов, начинающихся с ^\другой обратной косой черты и содержащих ее.

Связанный контент