다음 문자열을 포함하는 파일이 제공됩니다.
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;