
Мне нужно найти строки в файле, начинающиеся с **
.
Я не могу понять, как это сделать, потому что *
оболочка интерпретирует это как подстановочный знак.
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, его нужно экранировать.
Это работает до тех пор, пока в каталоге нет файлов, начинающихся с ^\
другой обратной косой черты и содержащих ее.