sed에서 역참조를 일치시키는 방법은 무엇입니까?

sed에서 역참조를 일치시키는 방법은 무엇입니까?

sed이 사이트에서 삭제를 수행하는 한 줄 명령을 찾았습니다 $PATH. 이해할 수 없는 개념이 있습니다. 일치 섹션에 저장된 일치 항목을 사용하여 중복 항목을 검색한 다음 일치 항목을 \1\2.

아래 예에서는 이유를 이해할 수 없습니다.\1 항상 그런 것은 아니다 1111. 테스트 케이스에서는 \1패턴 공간에서 매칭이 더 진행되는 것을 명확하게 보여주지만 왜 그런지 모르겠습니다.

sed스크립트( sed_cmd):

p  #debug
:b
s/[:;]\([^:;]*\)\([:;].*\)[;:]\1/;y\1yx\2x/p
s/[yx]//g   #debug remove the field indicators for the next pass
s/;/:/g     #debug
tb
s/^\([^:]*\)\(:.*\):\1/\1\2FixedFirst/
aDone

테스트 명령 + 출력:

echo "0000:1111:2222:3333:4444:1111:2222:3333:0000" | sed -f sed_cmd
0000:1111:2222:3333:4444:1111:2222:3333:0000
0000;y1111yx:2222:3333:4444x:2222:3333:0000
0000:1111;y2222yx:3333:4444x:3333:0000
0000:1111:2222;y3333yx:4444x:0000
0000:1111:2222:3333:4444FixedFirst
Done

답변1

대체 명령의 패턴은 다음과 같습니다 [:;]\([^:;]*\)\([:;].*\)[;:]\1. \1마지막에 주목하세요 . 이는 첫 번째 그룹과 일치하는 모든 텍스트가 \([^:;]*\)패턴 끝에 나타나야 함을 의미합니다.

패턴 공간은 처음에 입니다 0000:1111:2222:3333:4444:1111:2222:3333:0000. 패턴은 과 일치 :1111:2222:3333:4444:1111하며 1111첫 번째 그룹과 \1마지막 그룹과 일치합니다.

첫 번째 교체 라운드 후 패턴 공간은 다음과 같습니다.변경됨도착하다 0000:1111:2222:3333:4444:2222:3333:0000. 이제 1111패턴 공간에서 사용하여 일치 하면 일치하는 항목이 남지 \([^:;]*\)않습니다 . 따라서 패턴을 일치시킬 수 없으며 정규식 엔진은 다른 것을 시도합니다. 이 경우 첫 번째 그룹에서 다음으로 사용 가능한 일치 항목을 사용하는 것이 유효합니다.1111\12222

관련 정보