
다음 문자열이 포함된 파일이 제공됩니다.
fastcgi_param WP_ENV staging;
'staging'이라는 단어를 새 문자열로 대체할 sed 표현식이 필요합니다.
fastcgi_param WP_ENV production;
첫 번째 예에서 세 번째 단어는 가변적입니다. 개발, 로컬 등과 같은 소문자 문자열일 수 있습니다.
나는 다음을 시도했다:
sed 's/fastcgi_param WP_ENV [\w+]/fastcgi_param WP_ENV production/g'
하지만 작업을 올바르게 선택하지 않습니다. 단어의 정규 표현식이 일치하지 않습니다.
이러한 유형의 교체를 수행하는 올바른 sed 명령은 무엇입니까?
답변1
-E
대괄호를 추가 하고 제거합니다.
$ sed -E 's/fastcgi_param WP_ENV \w+/fastcgi_param WP_ENV production/g' file
fastcgi_param WP_ENV production;
노트:
+
기본 정규식에서는 지원되지 않습니다.-E
을 지원하는 확장 정규식을 켭니다+
.\w+
하나 이상의 단어 문자와 일치합니다. , 또는[\w+]
중 하나와 일치합니다 .\
w
+
\w
휴대용이 아닙니다. POSIX 호환성을 위해서는 다음을 사용하십시오.$ sed -E 's/fastcgi_param WP_ENV [[:alnum:]]+/fastcgi_param WP_ENV production/g' file fastcgi_param WP_ENV production;
캡처 그룹을 사용하면 해당 줄의 이중 입력을 피할 수 있습니다.
$ sed -E 's/(fastcgi_param WP_ENV) [[:alnum:]]+/\1 production/g' file fastcgi_param WP_ENV production;
답변2
하다:
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;