input.txt
텍스트 파일에서 두 개의 패턴( and)이 발견되면 텍스트 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 관련 솔루션1:
awk -i /usr/share/awk/inplace.awk '!(/string1/ && /string2/)' file.txt
이식 가능한 경우 perl
여기에서 사용할 수 있습니다.
perl -ni -e 'print unless /string1/ && /string2/'
^사용하지 마세요-i inplace
현재 작업 디렉터리(as or)에서 확장 기능을 먼저 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의 주석은 블록 뒤에 쉼표가 필요하다는 점을 제외하면 grep
Perl의 주석과 유사합니다 . 대신 메서드 호출을 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