sed의 정규식에서 대체 "|"사용


78

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

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

돌아와야한다

" blib bou "

그러나 그것은 반환

"blia blib bou blf".

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

답변:


110

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

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

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

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

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

`REGEXP1 \ | REGEXP2 '

REGEXP1 또는 REGEXP2와 일치합니다.

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

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

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


35
이 답변으로 혼란스러워하는 사람이라면 누구나 | 바닐라 sed (os x에 sed)가 아닌 gnu sed (os x에 ggs)에서만 작동합니다.
Andrew Hancox

@AndrewHancox 정말 감사합니다! 나는 머리에서 모든 머리카락을 찢어 버리려고했다 (그리고 지금까지 나는 머리카락 정면의 관리자와 비교할 때 꽤 잘하고있다)-나는 RegEx가 시도하기에 충분하다는 것을 알고있다. 그리고 \ | 그러나 OSX가 실제로 비 gnu sed를 사용할 수 있다는 사실에 대해서는 생각하지 않았습니다.
phatskat

8
표준 BSD / OS X 버전은 sed대체를 지원하지만 "확장 된"정규식 구문 ( -E) 만 사용 합니다. 이는 파이프 나 괄호에 백 슬래시가 없음을 의미합니다.echo "blia blib bou blf" | sed -E 's/bl(ia|f)//g'
Mark Reed

2
GNU sed 전용임을 알기 위해 답변을 편집했습니다.
sleske

22

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

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

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

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

12

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

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

산출:

hi hi

예, -r옵션은 표현식의 가독성에 실제로 도움이됩니다. 그 대답이 받아 들여 져야합니다.
рüффп

9

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

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

2
이식성이 +1이므로 시스템에 펄이 있으면 sed와 달리 항상이 구문을 사용합니다.
evilsoup

4

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

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

1

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.