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에 대한 것 입니다. sed
BSD에서 다르게 사용되는 것과 같은 다른 변형 이 있습니다 .
답변
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
입니다.
따옴표는 유형이어야합니다 "
. 명령을 구문 분석하려면 “필수”입니다.