foo와 일치하지만 bar와 일치하지 않는 행을 어떻게 삭제할 수 있나요?

foo와 일치하지만 bar와 일치하지 않는 행을 어떻게 삭제할 수 있나요?

다음 파일에서 두 번째와 세 번째 줄을 삭제하고 싶지만 네 번째 줄(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/'

grepPCRE를 지원하는 GNU:

grep -vP '^(?!.*bar).*foo'

(PCRE를 사용하여부정적인 예측 연산자 (?!...)).

이 중 perl이 옵션은 이식 가능한 내부 편집( perl모든 버전이 설치된 시스템) 에만 허용됩니다 -i.

표준은 sed내부 편집을 수행하지 않습니다. 그러나 sed일부 최근 BSD는 이 -i ''옵션을 허용하고 GNU는 확장 기능으로 sed이를 허용합니다 -i(둘 다 ).perl

최신 버전의 GNU awk도 허용됩니다 -i inplace.

관련 정보