Как сопоставить строки, содержащие символ $
?
Пример: следующий grep
не возвращает совпадение.
param="ambari_parameter$" echo "ambari_parameter$" | grep $param echo "ambari_parameter$" | grep "$param"
В этом случае строка в $param
будет интерпретироваться как регулярное выражение. Это выражение содержит $
который привязывает параметр ambari_parameter
в шаблоне до конца совпадения. Поскольку ambari_parameter$
во входных данных не содержит ambari_parameter
в самом конце, он не будет соответствовать.
Вы можете выбрать совпадение с фиксированной строкой вместо обычного выражения , используя -F
:
echo "ambari_parameter$" | grep -F -e "$param"
Я также использовал -e
здесь, чтобы заставить grep
распознать следующий аргумент как шаблон. Это необходимо, если $param
начинается с тире ( -
).
Чтобы дополнительно потребовать, чтобы вся строка ввода соответствовала полной строке, добавьте -x
:
echo "ambari_parameter$" | grep -xF -e "$param"
Если $param
является ambari_parameter$
, то это не будет соответствовать строке _ambari_parameter$
(которая будет соответствовать, если -x
не _ambari_parameter$
).
Если у вас есть целый шаблон, который вы хотите сопоставить буквально, то не рассматривайте его как регулярное выражение . Если вам нужно сопоставить литерал $
в регулярном выражении, используйте \$
.
Вроде .
, \
и несколько других символов пунктуации, $
– метасимвол в регулярных выражениях. Символ $
соответствует пустой строке в конце строки (поэтому x$
соответствует x
но только в конце строки). Если ваш шаблон не содержит метасимволов, вам не нужно рассматривать его как регулярное выражение, и вы должны использовать grep -F
как объясняет Кусаланда .
Если вам действительно нужно сопоставить $
или любой другой метасимвол буквально в регулярном выражении, избегайте его с помощью \
metacharacter. Чтобы сопоставить литерал $
write \$
, чтобы соответствовать литералу \
write \\
и т. Д.
param='ambari_parameter\$' echo "ambari_parameter$" | grep "$param"
Когда вы назначаете param
в оболочке, заключите регулярное выражение в одинарные кавычки ( '
'
), как показано выше, потому что $
и \
также имеют специальные значения в большинстве оболочек, включая все оболочки в стиле Bourne (вы отметили bash ). \
in shells работает в основном так же, как и в регулярных выражениях. ( $
не используется, он используется для различных расширений оболочки / подстановок , особенно для расширения параметров ).
Unquoted или даже в двойных кавычках \$
указывает на литерал $
в оболочке, который затем передается в grep
как $
который grep
интерпретирует как метасимвол регулярного выражения. Закрытие его в одинарных кавычках предотвращает это. Вы можете в качестве альтернативы написать \\\$
или иногда просто \\$
но это сбивает с толку.
Вам следует избегать специальных символов на случай, если вы ищете точное их соответствие следующим образом:
если он находится в одной кавычки, требуется один побег.
grep 'parameter\$'
если он находится в двойной кавычки или не цитируется, требуется один побег.
grep "parameter\\$" #or grep parameter\\$
Обратите внимание, что любое пространство внутри матча, если оно не указано, также должно быть экранировано.
grep para\ meter\\$