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)의 sed
BSD 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 행과 일치합니다. ...