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
\1
2222