Ubuntu 14의 변수 단어에 대한 Sed 정규 표현식

Ubuntu 14의 변수 단어에 대한 Sed 정규 표현식

다음 문자열을 포함하는 파일이 제공됩니다.

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;

노트:

  1. +기본 정규식은 지원되지 않습니다. -E확장 정규 표현식에 대한 지원을 켭니다 +.

  2. \w+하나 이상의 단어 문자와 일치합니다. [\w+], 또는 중 하나와 일치합니다 .\w+

  3. \w휴대가 쉽지 않습니다. POSIX 호환성을 위해서는 다음을 사용하십시오.

    $ sed -E 's/fastcgi_param WP_ENV [[:alnum:]]+/fastcgi_param WP_ENV production/g' file
    fastcgi_param WP_ENV production;
    
  4. 줄을 두 번 입력하지 않으려면 캡처링 그룹을 사용할 수 있습니다.

    $ 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;

관련 정보