Мне нужно найти, если какие-либо строки в файле начинаются с **
.
Я не могу понять, как это сделать, потому что *
интерпретируется оболочкой как подстановочный знак.
grep -i "^2" test.out
работает, если строка начинается с 2, но
grep -i "^**" test.out
очевидно не работает.
(Мне также нужно знать, заканчивается ли эта строка символом a, )
но еще не пытался это сделать).
text-processing
grep
quoting
Шар хантер
источник
источник
*
не нужно бежать в данном конкретном случае, FWIW.grep "^\\*\\*"
так, чтобы grep получал нужную^\*\*
строку, чтобы избежать интерпретации звездочек как квантификаторов регулярных выражений.Как вы хотели проверить строку, которая начинается
**
и заканчивается)
, вы можете объединить двеgrep
операции, как это,Или с помощью одной
grep
команды, как это,объяснение
^\*\*
: линия совпадения, которая начинается с**
.*
: соответствовать всему после**
\)$
: строка соответствия, которая также имеет)
в конце строки.источник
Это не оболочка
Ни один из ответов до сих пор не коснулся настоящей проблемы. Было бы полезно объяснить, почему это не работает так, как вы ожидаете.
grep -i "^**" test.out
Поскольку вы процитировали шаблон для grep ,
*
он не раскрывается оболочкой. Он передается в grep как есть. Это объясняется на странице руководства [1] для bash [2] :Это обычные регулярные выражения
Регулярное выражение - это шаблон, который описывает набор строк.
*
является одним из ключевых шаблонов в регулярных выражениях. По умолчанию grep интерпретирует это следующим образом:Это означает, что ваш шаблон в его нынешнем виде
^**
не имеет особого смысла. Возможно, он пытается найти начало строки ноль или более раз , дважды. Что бы это ни значило.Решение состоит в том, чтобы процитировать это:
grep -i "^\*\*" test.out
[1] Я не рекомендую читать это. Пожалуйста, используйте
man dash
или аналогичные.[2] Оболочки не было дано, поэтому я предполагаю, что bash .
источник
Другие опции.
Вы можете использовать
sed
илиawk
такжеЧтобы узнать строки, которые заканчиваются
)
использованием такжеgrep
илиsed
илиawk
источник
'/^*\*/&&/)$/'
...Это совершенно не цитируемая версия
grep ^\\*\\* test.out
. Чтобы передать буквенный обратный слеш из оболочки в grep, его необходимо экранировать.Это работает, пока у вас нет файлов в каталоге, начиная с
^\
другой обратной косой черты.источник