/(.+)\n\1/ 작동하지만 /(.*)\n\1/ 둘 다 작동해야 할 때는 작동하지 않습니다.

/(.+)\n\1/ 작동하지만 /(.*)\n\1/ 둘 다 작동해야 할 때는 작동하지 않습니다.

다른 질문에 대답한 후 놀다가 sed발견했는데 동일한 결과가 나오지 않습니다 .+..*둘 다 여러 문자와 일치하는 경우컨텍스트 주소에서.
아래 명령 1 :

sed -E '$!N;/(.+)\n\1/!P;D' <<IN
one
one_more
two
two_more
IN

인쇄

one_more
two_more

좋아요, 이것이 예상되는 결과입니다.
정규 표현식을 에서 .+( .*즉, 에서하나 이상의 문자도착하다0개 이상의 문자)는 동일한 결과를 제공해야 하지만 다음과 같은 결과는 그렇지 않습니다.

sed -E '$!N;/(.*)\n\1/!P;D' <<IN
one
one_more
two
two_more
IN

한 줄만 인쇄

two_more

여기서 무슨 일이 일어나고 있는 걸까요?


1: 단순성과 가독성을 위해 ERE를 사용하고 있습니다. BRE에서도 마찬가지입니다.

답변1

이는 /(.*)\n\1/간단한 개행 문자도 일치하기 때문에 발생합니다( \n: 빈 문자열, 개행 문자, 그 다음에동일한처음부터 시작하는 것은 빈 문자열입니다).

one_more\ntwo따라서 귀하의 예에서도 문자열과 일치합니다.

sed -E '$!N;/^(.+)\n\1/!P;D'이를 방지하려면 또는 같은 정규식을 고정해야 합니다 sed -E '$!N;/^(.*)\n\1/!P;D'.

관련 정보