Intereting Posts
Может ли команда rsync запускаться с использованием нескольких процессоров? Как установить отдельные настройки глобальной / пользовательской клавиатуры в LXDE? Mutt извлекает без дубликатов или удаляет все Как fsnotify влияет на производительность системы? Каков вход для входа в систему openSUSE по умолчанию? lxml с пользовательским местом установки для libxml2 / libxslt не находит правильное местоположение Извлечение данных с помощью awk, когда некоторые строки имеют пустые / отсутствующие значения Маршрутизация между несколькими подсетями Что делает команда «$ ()» в UNIX? Разделить большой файл на несколько? Команда для работы со всеми файлами в папке и вывода результата в один файл Когда впервые было введено различие между однопользовательскими и многопользовательскими режимами UNIX? захват вывода из команды без помех Использование grep для поиска первых двух номеров IP-адресов? Использование sed для удаления всего двух слов?

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

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

Пример: следующий 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\\$