Как сопоставить строку, содержащую символ «$», с помощью grep?

grep -F 'word1
word2' infile

или, если хотите в одну строку:

grep -F -e 'word1' -e 'word2' infile
5
21.08.2017, 18:58
3 ответа

В этом случае строка в $paramбудет интерпретироваться как регулярное выражение. Это выражение содержит $, который привязывает параметр ambari_parameterв шаблоне к концу совпадения. Поскольку ambari_parameter$во входных данных не содержит ambari_parameterв самом конце (из-за $в конце строки), он не будет совпадение.

Вы можете просто экранировать $как \$в шаблоне ( \\$в строке с двойными кавычками) или поместить $в группе, заключенной в квадратные скобки, как [$], но, поскольку вы, кажется, хотите выполнить совпадение строки, а не соответствие регулярному выражению, может быть более подходящим использовать -F:

echo 'ambari_parameter$' | grep -F -e "$param"

Использование grep -Fзаставляет grepобрабатывать данный шаблон как строку, а не как регулярное выражение. Таким образом, каждый символ в шаблоне будет совпадать буквально, даже $в конце.

Я также использовал здесь -e, чтобы заставить grepраспознавать следующий аргумент как шаблон. Это необходимо, если $paramначинается с тире ( -). Обычно хорошо использовать -eвсякий раз, когда шаблон, с которым вы сопоставляетесь, задан в переменной.

Чтобы еще больше потребовать, чтобы целая строка ввода соответствовала полной строке, добавьте -x:

echo 'ambari_parameter$' | grep -xF -e "$param"

Если $paramравно ambari_parameter$ , то это не будет соответствовать строке _ambari_parameter$или ambari_parameter$100(но будет соответствовать , если -xне указано ).

14
27.01.2020, 20:31

Вам следует экранировать специальные символы, если вы ищете их точное совпадение, следующим образом:

если они в одинарных кавычках, требуется один экранирование.

grep 'parameter\$'

если он в двойных кавычках или не в кавычках, требуется еще один экран.

grep "parameter\\$" #or
grep parameter\\$

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

grep para\ meter\\$
2
27.01.2020, 20:31

Если у вас есть целый шаблон, который вы хотите сопоставить буквально , не рассматривайте его как регулярное выражение. Если вам doнужно сопоставить литерал $в регулярном выражении, используйте \$.

Нравится . , \и несколько других знаков препинания, $— это метасимвол в регулярных выражениях. Символ $соответствует пустой строке в конце строки (поэтому x$соответствует x, но только в конце строки. линия). Если ваш шаблон не содержит каких-либометасимволов, вам не нужно рассматривать его как регулярное выражение, и вы должны использовать grep -F , как объясняет Кусалананда.

Есливам действительно нужно сопоставить $или любой другой метасимвол буквально в регулярном выражении, экранируйте его метасимволом \. Чтобы сопоставить литерал $напишите \$, чтобы сопоставить литерал \напишите \\и так далее.

param='ambari_parameter\$'
echo "ambari_parameter$" | grep "$param"

Когда вы присваиваете paramв оболочке, заключайте регулярное выражение в одинарные кавычки ( ''), как показано выше, потому что $и \также имеют особое значение в большинстве оболочек, включая все оболочки в стиле Борна (вы отметили ).\в оболочкахработает в основном так же, как и в регулярных выражениях. ( $нет; он используется для различных расширений/замен оболочки, особенно расширения параметров).

Без кавычек или даже в двойных кавычках, \$указывает литерал $в оболочке, который затем передается в grepкак $, который grepинтерпретирует как метасимвол регулярного выражения. Заключение его в одинарные кавычки предотвращает это. В качестве альтернативы вы можете написать \\\$— или иногда просто \\$— но это сбивает с толку.

8
27.01.2020, 20:31

Теги

Похожие вопросы