sed를 사용하여 첫 번째 일치하는 줄만 삭제할 수 있나요?

sed를 사용하여 첫 번째 일치하는 줄만 삭제할 수 있나요?

testfile.txt다음 이 포함된 파일이 있습니다.

pippo=x
pluto=y
1234=z

삭제만 하고 싶어요첫번째줄 일치 /^[a-z]\+=/(이 예에서는 첫 번째 줄).

다음 명령으로 시도했지만 성공하지 못했습니다.

sed   '/^[a-z]\+=/,+0d' testfile.txt

하지만 첫 번째라인이 삭제됩니다.

을 사용하여 이 작업을 수행할 수 있는 방법이 있습니까 sed?

문안 인사

답변1

sed명령 관련 문제

$ sed '/^[a-z]\+=/,+0d' testfile.txt

sed스크립트가 적용된다는 것입니다 .모든입력 데이터 라인.

+0(GNU 확장임) 은 스크립트가 다음과 동일함을 의미합니다.

$ sed '/^[a-z]\+=/d' testfile.txt

보시다시피 첫 번째와 두 번째 줄이 삭제됩니다.

덧붙여서, 당신은 정확히 같은 것을 얻을 것입니다효과를 사용하고 있지만 +1다른 이유가 있습니다. 이 d명령은 첫 번째 줄의 일치로 인해 첫 번째 줄과 두 번째 줄에 개별적으로 적용되는 대신 처음 두 줄에 적용됩니다(즉, 명령의 범위는 d첫 번째 줄과 한 줄 이상입니다 +1). 세 번째 줄은 범위를 벗어났기 때문에 삭제되지 않습니다.

GNU sed솔루션

$ sed '0,/^[a-z]\+=/{//d}' testfile.txt

@Whitefield 사용자가 게시한 작업은 꽤 훌륭합니다(비록 -r옵션이 불필요하고 이 경우 0시작 주소가 POSIX 스타일로 변경될 수 있음에도 불구하고).1

동일한 접근 방식의 BSD sed변형은 다음과 같습니다.

$ sed '1,/^[a-z]+=/{/^[a-z]+=/d
  }' testfile.txt

"현대 기본 정규식"이 아닌 "구식 기본 정규식"을 구현하는 경우에만 이스케이프가 +필요합니다 . 내 시스템(Mac OS X)의 sedBSD sed와 GNU는 모두 sed"현대적인" 종류인 것 같습니다. POSIX에는 이러한 구별이 없으며 설명서( re_format(7)이 구별을 만드는 BSD)와 POSIX 사양을 나란히 읽으면 머리가 어지러워집니다.

답변2

@ John1024 죄송하지만 첫 번째 일치 줄이 파일의 첫 번째 줄인 경우에만 솔루션이 작동합니다.

다음 코드로 문제를 해결했지만 sed -r '0,/^[a-z]\+=/{//d;}' testfile.txt이전 솔루션이 posix sed에서도 작동했어야 했다고 확신합니다.

실제로 아이디어는 두 번째 줄 주소에 0 줄의 오프셋을 제공하는 것이었지만 여전히 다음 줄도 삭제합니다. 이는 버그처럼 들립니다.

man sed우분투 14.04 에서

... addr1,+N addr1 및 addr1 다음의 N 행과 일치합니다. ...

관련 정보