다음 파일에서 두 번째와 세 번째 줄을 삭제하고 싶지만 네 번째 줄(foo와 일치하지만 bar는 일치하지 않는 줄)은 삭제하고 싶지 않다고 가정합니다. 예를 들어 sed를 사용하여 이 작업을 쉽게 수행할 수 있습니까?
text
foo some more text
even more foo text
some foo text with bar
답변1
이것은 나에게 효과적인 것 같습니다.
sed '/foo/{/bar/!d;}' my_file
답변2
여러 가지 대안:
awk '! (/foo/ && !/bar/)'
awk '/bar/ || !/foo/'
sed -e /bar/b -e /foo/d
sed '/foo/{/bar/!d;}'
perl -ne 'print unless /foo/ && !/bar/'
grep
PCRE를 지원하는 GNU:
grep -vP '^(?!.*bar).*foo'
(PCRE를 사용하여부정적인 예측 연산자 (?!...)
).
이 중 perl
이 옵션은 이식 가능한 내부 편집( perl
모든 버전이 설치된 시스템) 에만 허용됩니다 -i
.
표준은 sed
내부 편집을 수행하지 않습니다. 그러나 sed
일부 최근 BSD는 이 -i ''
옵션을 허용하고 GNU는 확장 기능으로 sed
이를 허용합니다 -i
(둘 다 ).perl
최신 버전의 GNU awk
도 허용됩니다 -i inplace
.