sed 패턴 일치의 이상한 동작

sed 패턴 일치의 이상한 동작

다음 두 가지 예는 예상되는 동작입니다.
"xxx2"와 "xxx@"는 모두 "xxx." 패턴과 일치하므로 문제가 없습니다.

$ echo abc1xxx2abc3abc4@111 | sed -rn 's/((abc.|xxx.){3}).*/\1/p'
abc1xxx2abc3

$ echo abc1xxx@abc3abc4@111 | sed -rn 's/((abc.|xxx.){3}).*/\1/p'
abc1xxx@abc3

아래 두 가지 예도 예상되는 동작입니다.
"xxx@" 및 "xxxy"는 모두 "xxx"와 일치합니다. 패턴
이지만 다음 "@" 문자가 패턴과 일치하지 않아 출력이 없습니다.

$ echo abc1xxx@@abc3abc4@111 | sed -rn 's/((abc.|xxx.){3}).*/\1/p'
no output

$ echo abc1xxxy@abc3abc4@111 | sed -rn 's/((abc.|xxx.){3}).*/\1/p'
no output

그런데 위의 예에서 "y"를 "x"로 변경하면
다음 문자가 "@"이더라도 갑자기 패턴이 일치하므로
이 동작을 이해할 수 없습니다 .

$ echo abc1xxxx@abc3abc4@111 | sed -rn 's/((abc.|xxx.){3}).*/\1/p'
abc1xxxx@abc3abc4

답변1

무슨 일이 일어나고 있는지 볼 수 있도록 패턴을 조금 변경해 보겠습니다( ^.*전체 입력 줄이 역참조로 대체되도록 시작 부분에 추가하기만 하면 됩니다).

$ echo abc1xxxx@abc3abc4@111 | sed -rn 's/^.*((abc.|xxx.){3}).*/\1/p'
xxx@abc3abc4

xxx@따라서 일치하고 abc3그 뒤에 abc4. 이는 패턴이 or 의 세 가지 abc.발생을 찾기 때문에 완벽하게 합법적이며 예상됩니다 xxx..

출력 줄의 시작 부분은 abc1x패턴의 영향을 받지 않으므로 대체로 대체되지 않습니다. 방금 입력에서 전달되었습니다.

관련 정보