
input.txt
텍스트 파일에서 두 개의 패턴( string1
및 string2
)이 발견 되면 텍스트 파일( )에서 한 줄을 삭제하고 싶습니다.같은행, sed
.
시도 중:
sed -i "/\b\(string1\|string2\)\b/d" input.txt
이지만 string1
OR 이 포함된 행을 삭제하는 중입니다 string2
.
답변1
sed -i "/string1.*string2\|string2.*string1/d" input.txt
이렇게 하면 string1이 string2 앞에 나타나거나 string2가 string1 앞에 나타나는 줄이 삭제됩니다. 줄을 삭제하려면 두 문자열이 어느 순서로든 줄에 있어야 합니다.
답변2
sed -ie '/string1/!b' -e '/string2/d' file.txt
순서에 관계없이 string1
및 를 모두 포함하는 줄을 삭제합니다 ( 를 포함하는 줄에서 찾을 때와 같이 겹칠 수도 있음 ).string2
foobar
barbaz
foobarbaz
-i
위는 GNU 확장입니다. 또 다른 GNU 관련 솔루션¹:
awk -i /usr/share/awk/inplace.awk '!(/string1/ && /string2/)' file.txt
아마도 perl
여기에서 다음을 사용할 것입니다.
perl -ni -e 'print unless /string1/ && /string2/'
¹사용하지 마세요-i inplace
as 는 누군가 악성 코드를 심었을 수 있는 현재 작업 디렉터리에서 확장명(as 또는 )을 먼저 gawk
로드하려고 시도합니다 . 와 함께 제공되는 확장 프로그램 의 경로는 시스템에 따라 다를 수 있습니다.inplace
inplace
inplace.awk
inplace
gawk
gawk 'BEGIN{print ENVIRON["AWKPATH"]}'
답변3
사용라쿠(이전에는 Perl_6으로 알려짐)
~$ raku -ne '.put unless .match(/ foobar / & / barbaz / ) ;' file
또는
~$ raku -ne '.put unless grep({ / foobar / & / barbaz / }, $_ ) ;' file
위에는 Raku를 사용하여 OP 작업을 수행하는 두 가지 일반적인 방법이 있습니다. Raku의 메모는 블록 뒤에 쉼표가 필요하다는 점을 제외하면 Perl grep
과 유사합니다 . 대신 메서드 호출을 grep
사용할 수도 있으며 괄호 안에 .grep
쓰는 것에 대해 걱정할 필요가 없습니다 .$_
위의 코드 예제는 두 개의 문자열을 포함하는 줄을 삭제합니다.순서와 관계없이 문자열이 겹치는지 여부에 관계없이.예를 들어:
샘플 입력:
1 foo
2 bar
3 baz
4 foobar
5 foobaz
6 barbaz
7 foobar foobaz
8 foobaz barbaz
9 foobar barbaz
10 foobar foobaz barbaz
11 foobaz barbaz foobar
12 barbaz foobar foobaz
13 foobarbaz
샘플 출력(위의 코드 예):
1 foo
2 bar
3 baz
4 foobar
5 foobaz
6 barbaz
7 foobar foobaz
8 foobaz barbaz
foobarbaz
위 코드는 string1과 string2가 겹치는 13행을 포함하여 9~13행을 삭제합니다 . 정의된 순서로(겹치지 않고) 나타나는 문자열을 삭제해야 하는 경우 Raku에서도 그렇게 할 수 있습니다.
~$ raku -ne '.put unless m/foobar .* barbaz/;' file
위에서는 9행과 10행을 제거합니다: foobar barbaz
및 foobar foobaz barbaz
.
Raku 정규식을 사용하면~할 수 있다:overlap
(또는 :ov
) 매개변수/부사를 사용하여 겹치는 두 문자열을 감지합니다 . 아래 첫 번째 링크를 참조하세요.
https://docs.raku.org/언어/regexes#Overlap
https://docs.raku.org/언어/regexes
https://raku.org