Escaping * с регулярными выражениями и Grep

У меня есть файл, который имеет уникальные строки, начинающиеся с 2 звезд (**).

Однако, когда я запускаю команду grep для

grep \*\* fileName 

Я получаю все строки в файле. Это очень необычно, и то, что я вижу как несогласованные строки, не содержит **.

Как мне избежать ** для правильных строк, которые нужно найти?

Поэтому постарайтесь :

 egrep "^\*\*" YOUR_FILE 

Не забудьте использовать двойную кавычку.

Примечание. Используйте egrep вместо grep .

Вы также можете добиться того же, grep что строка, которую она должна соответствовать, является фиксированной строкой. Переключателем для этого является -F или --fixed-strings .

 -F, --fixed-strings Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched. (-F is specified by POSIX.) 

Итак, что-то вроде этого будет делать это:

 $ grep -F "**" somefile.txt 

пример

 $ cat somefile.txt ** blah blahblah ** hi 

В Grepping файл создается следующее:

 $ grep -F "**" somefile.txt ** blah ** hi 

В:

 grep \*\* fileName 

Обратные косые черты используются, чтобы избежать * в оболочке (где * – оператор глобулизации).

В качестве второго аргумента grep получает строку из двух символов: ** .

Как регулярное выражение, это означает любое (0 или более) число звездных символов , поэтому в основном оно совпадает везде, так как оно также соответствует пустой строке, которая объясняет, почему вы получаете все строки файла.

Поскольку * является специальным для grep regex, вам также необходимо убежать от него. Лучше всего использовать одинарные кавычки вместо обратных косых черт для выхода * в оболочку (поскольку одинарные кавычки – это сильные кавычки оболочки, которые упускают каждый символ, но сам символ одиночной кавычки) и используют обратную косую черту для перехода * в grep. Двойные кавычки также будут работать в этом случае, но будьте осторожны, что обратные косые черты по-прежнему являются особенными для оболочки внутри двойных кавычек.

Так:

 grep '\*\*' somefile.txt 

* escaped, так что они больше не являются операторами регулярных выражений, но считаются буквальными символами) возвращают строки somefile.txt которые содержат последовательность из двух звездных символов. Если вы хотите, чтобы их находили только в начале строки, вы должны использовать оператор regex привязки ^ :

 grep '^\*\*' somefile.txt 

Альтернативный способ: * не принимать в качестве оператора регулярных выражений использовать диапазоны символов:

 grep '^[*][*]' somefile.txt 

Альтернативный способ указать двух звездных символов – это написать:

 grep '^\*\{2\}' somefile.txt 

(где \{ – другой оператор регулярных выражений), который легче читать, если вы используете расширенные регулярные выражения, как при передаче опции -E в grep (избегайте egrep поскольку он не является стандартным):

 grep -E '^\*{2}' somefile.txt 

(в расширенных регулярных выражениях, { – оператор регулярных выражений).