다음 명령은 두 가지 방법으로 작성할 수 있습니다.
# 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) 구문에서는 그 반대가 적용됩니다. 이러한 문자는 백슬래시('\') 접두사가 붙지 않는 한 특별합니다..