sed 이식성: 확장 정규식 및 백슬래시

sed 이식성: 확장 정규식 및 백슬래시

다음 명령은 두 가지 방법으로 작성할 수 있습니다.

# using extended regex
$ echo foobar | sed -E 's/(foo)(bar)/\2\1/'
barfoo

그리고:

# using backslashes
$ echo foobar | sed 's/\(foo\)\(bar\)/\2\1/'
barfoo

백슬래시를 사용하면 이 명령이 확장 정규식보다 이식성이 더 높다는 뜻인가요?

답변1

이것현재 POSIX 표준sed-E확장 정규식(ERE)을 활성화하는 플래그가 지정되지 않았습니다 . 이것만으로도 기본 정규식(BRE) 형식이 's/\(foo\)\(bar\)/\2\1/'가장 이식성이 높다는 결론을 내리기에 충분합니다.

하지만, 그 기준이 -E포함되어 있다고 해도──sed그것은 될 것이다-, 이것정규식 문서 ERE에 역참조가 정의되지 않았습니다.이므로 BRE \(...\) == ERE (...)연결 자체는 GNU 확장이며 모든 프로그램에서 지원된다는 보장은 없습니다.POSIX 쿼리예를 들어 -E플래그가 포함되어 있지만 각 플래그는

grep 'ee*'
grep -E 'e+'
grep '\(.\)\1'

준수하고,

grep -E '(.)\1'

아니요.

마찬가지로,보고서특히 BSD는 확장을 따르지 않는다고 명시합니다.

[FreeBSD에서] sed -E '/(.)\1/d'다른 문자가 포함된 줄을 제거합니다.1

GNU는 sed이것을 역참조로 처리하고 두 개의 동일하고 인접한 문자가 포함된 줄을 삭제합니다.

답변2

sed -E확장 정규식( ERE)을 사용한다는 의미이며, 해당 플래그가 없으면 기본 정규식( BRE)을 사용합니다.

모든 sed버전이 확장 정규식을 처리할 수 있는 것은 아니므로 이식성이 더 좋지만 백슬래시를 사용했기 때문은 아닙니다. 이것은 정상입니다 BRE.

바라보다BRE와 ERE

답변3

GNU 매뉴얼대답하다:

5.2 기본(BRE) 및 확장(ERE) 정규식

기본 정규식과 확장 정규식은 패턴을 지정하는 구문의 두 가지 변형입니다. BRE(기본 정규 표현식) 구문은 sed(및 grep에서도 유사)의 기본 구문입니다. ERE(확장 정규식) 구문을 활성화하려면 POSIX 지정 -E 옵션(-r, --regexp-extended)을 사용하세요.

GNU sed에서 기본 정규식과 확장 정규식의 유일한 차이점은 "?", "+", 괄호, 중괄호("{}") 및 "|"와 같은 일부 특수 문자의 동작입니다.

기본(BRE) 구문을 사용하여,이러한 문자는 백슬래시('\') 접두사가 붙지 않는 한 특별한 의미가 없습니다. 확장(ERE) 구문에서는 그 반대가 적용됩니다. 이러한 문자는 백슬래시('\') 접두사가 붙지 않는 한 특별합니다..

관련 정보