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;

관련 정보