sed의 정규식에서 대체 “|”사용 예를 들면 다음과

sed, GNU sed 버전 4.2.1을 사용하고 있습니다. 교대 “|”를 사용하고 싶습니다 하위 표현식의 기호. 예를 들면 다음과 같습니다.

echo "blia blib bou blf" | sed 's/bl\(ia|f\)//g'

돌아와야한다

" blib bou "

그러나 그것은 반환

"blia blib bou blf".

어떻게 예상 결과를 얻을 수 있습니까?



답변

“|” 특별한 의미를 얻으려면 백 슬래시가 필요합니다.

echo "blia blib bou blf" | sed 's/bl\(ia\|f\)//g'

당신이 원하는 것을 할 것입니다.

아시다시피, 다른 모든 것이 실패하면 매뉴얼 :-)을 읽으십시오.

GNU sed 사용자 매뉴얼 , 3.3 정규 표현식 구문 개요 :

`REGEXP1 \ | REGEXP2 ‘

REGEXP1 또는 REGEXP2와 일치합니다.

백 슬래시를 참고하십시오 …

불행히도 정규 표현식 구문은 실제로 표준화되지 않았습니다. “특수 문자”가 필요한 것과 그렇지 않은 것에는 다른 많은 변형이 있습니다. 일부는 심지어 구성 가능하거나 스위치에 의존합니다 (GNU grep에서 와 같이 세 개의 다른 정규식 방언 사이를 전환 할 수 있음).

이 답변은 특히 GNU sed에 대한 것 입니다. sedBSD에서 다르게 사용되는 것과 같은 다른 변형 이 있습니다 .


답변

GNU 이외의 sed구현 에 대해서는 몇 가지 주석이 있으므로 최소한 OS X에서는 다음과 같은 -E인수를  사용할 수 있습니다 sed.

정규 표현식을 기본 정규 표현식 (BRE) 대신 확장 (현대) 정규 표현식으로 해석하십시오. re_format (7) 매뉴얼 페이지에는 두 형식이 모두 설명되어 있습니다.

그러면 정규 표현식 메타 문자를 이스케이프하지 않고 사용할 수 있습니다. 예:

$ echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
 blib bou

답변

GNU sed는 -r옵션 (확장 정규 표현식) 도 지원합니다 . 즉, 메타 문자를 이스케이프 할 필요가 없습니다.

echo foohello barhello | sed -re "s/(foo|bar)hello/hi/g"

산출:

hi hi

답변

\|하나 Solaris 10에서 나오지도 작동하지 않습니다. 내가 사용한 것은

perl -p -e 's/bl(ia|f)//g'

답변

후속 조치 : sed -E는 MacOS에서 허용합니다. |에 대한 백 슬래시가 필요하지 않습니다.

 sed -E 's/this|orthat/oooo/g' infile

답변

Windows sed의 GnuWin32에서 구문은 sed "s/thing1\|thing2/ /g" source > destination입니다.

따옴표는 유형이어야합니다 ". 명령을 구문 분석하려면 “필수”입니다.