Выполните:
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;
Конечно, вам нужно экранировать символ ^
:
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'
С опцией P
(--perl-regexp
) и классом символов [...]
:
grep -Pri 'bindkey [\047\042]\^r' ~/.oh-my-zsh/plugins
[\047\042]
— соответствует одинарной кавычке \047
или двойной кавычке \042