Как можно искать как одинарные, так и двойные кавычки в поиске grep?

Выполните:

sed -E 's/^(([^[:blank:]]+[[:blank:]]+){2})[[:lower:]]+(.*)/\1production\3/'
  • ^ (([^ [: blank:]] + [[: blank:]] +) {2}) соответствует первым двум словам и помещает их в группу захваченных, чтобы мы могли указать группу в замене

  • [[: lower:]] + соответствует одному или нескольким символам нижнего регистра

  • (. *) соответствует оставшейся части строки и помещается в захваченную группу

  • При замене мы сохранили захваченную группу, 1 (первые два слова с завершающим пробелом) и 3 (часть после желаемых строчных букв, подлежащих замене). Между ними дается желаемая строка замены.

Пример:

% sed -E 's/^(([^[:blank:]]+[[:blank:]]+){2})[[:lower:]]+(.*)/\1production\3/' <<<'fastcgi_param WP_ENV staging;'
fastcgi_param WP_ENV production;
2
23.06.2017, 01:57
2 ответа

Конечно, вам нужно экранировать символ ^:

grep -r 'bindkey "\^r' dir

Затем вы можете использовать альтернативный символ «Расширенное регулярное выражение» '|':

grep -E 'bindkey "\^r''|'"bindkey '\^r"  dir

Что можно сократить до:

grep -E 'bindkey ("|'"')"'\^r' dir[1]

Или, если вы используете bash, ksh или zsh, используйте $'в кавычках (как ', так и "можно экранировать):

grep -E $'bindkey (\"|\')\^r' dir

И, наконец, поймите, что есть дваr:rиR:

grep -rE $'bindkey (\"|\')\^(r|R)' dir

Или используйте i(, но это изменит и другие символы):

grep -riE $'bindkey (\"|\')\^r' dir

Конечно, это тоже регулярное выражение perl (GNU grep):

grep -rP $'bindkey (\"|\')\^(r|R)' dir

[1] Цитата может быть непонятна.
Но это просто конкатенация трех цитируемых частей.
Строка, заключенная в одинарные кавычки, за которой следует строка, заключенная в двойные кавычки, за которой следует третья строка, заключенная в одинарные кавычки. Самый простой способ увидеть эффект — повторить его. Оболочка удалит один уровень кавычек, и строка, которую фактически получит команда, станет ясной:

$ echo grep -E 'bindkey ("|'   "')"   '\^r' dir
grep -E  bindkey ("|   ')   \^r dir

Может быть, с:

было бы проще увидеть
$ echo grep -E 'a'"b"'c' dir
grep -E abc dir

То же самое можно было бы написать в одной паре одинарных кавычек.
Помните, что одинарные кавычки нельзя заключать в одинарные кавычки:

$ echo grep -E 'bindkey ("|'\'')\^r' dir
grep -E bindkey ("|')\^r dir

Или внутри двойных кавычек (двойные кавычки могут быть экранированы внутри двойных кавычек ). С дополнительным риском того, что некоторые другие символы ($, `, \, *и @ )имеют особое значение внутри двойных кавычек (, а не внутри одинарных кавычек ):

.
$ echo grep -E "bindkey (\"|')\^r" dir
grep -E bindkey ("|')\^r dir

Альтернативой является использование списка символов […]с \'и \":

.
$ grep -E 'bindkey '[\"\']'\^r' dir

Это по-прежнему строка из трех частей, но середина не заключена в кавычки (и без пробелов):

'bindkey '    [\"\']     '\^r'
2
27.01.2020, 21:55

С опцией P (--perl-regexp) и классом символов [...]:

grep -Pri 'bindkey [\047\042]\^r' ~/.oh-my-zsh/plugins

  • [\047\042] — соответствует одинарной кавычке \047 или двойной кавычке \042
4
27.01.2020, 21:55

Теги

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