grep -F 'word1
word2' infile
или, если хотите в одну строку:
grep -F -e 'word1' -e 'word2' infile
В этом случае строка в $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
не указано ).
Вам следует экранировать специальные символы, если вы ищете их точное совпадение, следующим образом:
если они в одинарных кавычках, требуется один экранирование.
grep 'parameter\$'
если он в двойных кавычках или не в кавычках, требуется еще один экран.
grep "parameter\\$" #or
grep parameter\\$
Обратите внимание, что любой пробел внутри match, если он не заключен в кавычки, также должен быть экранирован.
grep para\ meter\\$
Если у вас есть целый шаблон, который вы хотите сопоставить буквально , не рассматривайте его как регулярное выражение. Если вам doнужно сопоставить литерал $
в регулярном выражении, используйте \$
.
Нравится .
, \
и несколько других знаков препинания, $
— это метасимвол в регулярных выражениях. Символ $
соответствует пустой строке в конце строки (поэтому x$
соответствует x
, но только в конце строки. линия). Если ваш шаблон не содержит каких-либометасимволов, вам не нужно рассматривать его как регулярное выражение, и вы должны использовать grep -F
, как объясняет Кусалананда.
Есливам действительно нужно сопоставить $
или любой другой метасимвол буквально в регулярном выражении, экранируйте его метасимволом \
. Чтобы сопоставить литерал $
напишите \$
, чтобы сопоставить литерал \
напишите \\
и так далее.
param='ambari_parameter\$'
echo "ambari_parameter$" | grep "$param"
Когда вы присваиваете param
в оболочке, заключайте регулярное выражение в одинарные кавычки ( '
'
), как показано выше, потому что $
и \
также имеют особое значение в большинстве оболочек, включая все оболочки в стиле Борна (вы отметили bash).\
в оболочкахработает в основном так же, как и в регулярных выражениях. ( $
нет; он используется для различных расширений/замен оболочки, особенно расширения параметров).
Без кавычек или даже в двойных кавычках, \$
указывает литерал $
в оболочке, который затем передается в grep
как $
, который grep
интерпретирует как метасимвол регулярного выражения. Заключение его в одинарные кавычки предотвращает это. В качестве альтернативы вы можете написать \\\$
— или иногда просто \\$
— но это сбивает с толку.