sed - 괄호를 포함할 때 그룹 불일치

sed - 괄호를 포함할 때 그룹 불일치

Hauge.txt

[email protected]
[email protected]
[email protected];es
[email protected]
[email protected]
@pepito.com 

이메일 추출은 그룹 없이도 작동합니다.

$ cat hoge.txt | sed -nr '/[^@]+@[^.]+\.com$/p'
[email protected]
[email protected]

cat hoge.txt | sed -nr 's/[^@]+@[^.]+\.com$/hoge/p'
-----
hoge
hoge

단, 그룹이 포함된 이메일에서는 사용자 이름 부분을 추출할 수 없습니다.

cat hoge.txt | sed -nr 's/\([^@]+\)@[^.]+\.com$/hoge/g'
---
(nothing matches)

cat hoge.txt | sed -nr 's/\([^@]+\)@[^.]+\.com$/\1/p'
-----
sed: -e expression #1, char 28: invalid reference \1 on `s' command's RHS

뭐가 문제 야?

답변1

이 답변은 주로 GNU에 대한 것입니다 sed.


내부에GNU 매뉴얼sed정규식 구문 및 사용법에 대한 설명이 있습니다 .

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

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

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

기본(BRE) 구문의 경우 이러한 문자는 앞에 백슬래시('\')가 없으면 특별한 의미가 없습니다. 확장(ERE) 구문의 경우에는 그 반대입니다. 이러한 문자는 앞에 백슬래시(')가 없으면 특수합니다. \')는 접두사입니다.

따라서 BRE를 사용하는지 ERE를 사용하는지에 따라 원하는 결과를 얻으려면 구문을 조정해야 합니다.

갈아 바수다:

$ sed -n 's/\([^@]\+\)@[^.]\+\.com$/\1/p' hoge.txt
tsar
cm_

긴급 상황:

$ sed -nE 's/([^@]+)@[^.]+\.com$/\1/p' hoge.txt
tsar
cm_

지금사용할 필요는 없습니다cat다른 유틸리티 와 마찬가지로 sed명령 끝에 파일을 참조하면 됩니다.

관련 정보