如果在同一行中找到兩個模式,則刪除該行

如果在同一行中找到兩個模式,則刪除該行

如果在文字檔案 ( )中找到input.txt兩個模式 (string1和) ,我想從文字檔案中刪除一行string2相同的行,使用sed.

我正在嘗試: sed -i "/\b\(string1\|string2\)\b/d" input.txt,但這正在刪除包含string1OR 的行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

這會刪除同時包含 和 的行string1string2無論順序如何(甚至可能會重疊,就像在包含 的行中查找foobarin時一樣)。barbazfoobarbaz

-i上面是一個 GNU 擴充。另一個特定於 GNU 的解決方案 1:

awk -i /usr/share/awk/inplace.awk '!(/string1/ && /string2/)' file.txt

可移植的是,您可能會perl在這裡使用:

perl -ni -e 'print unless /string1/ && /string2/'

^不使用-i inplaceas嘗試先從目前工作目錄gawk載入inplace擴充功能(asinplace或),有人可能已經在其中植入了惡意軟體。隨系統提供的擴展inplace.awk的路徑可能會有所不同,請參閱輸出inplacegawkgawk '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

上面的程式碼刪除了第 9 行到第 13 行,包括foobarbaz包含重疊 string1 和 string2 的第 13 行。如果您需要刪除按定義順序出現的字串(且不重疊),Raku 也可以做到這一點:

~$ raku -ne '.put unless m/foobar .* barbaz/;'  file

上面刪除了第 9 行和第 10 行:foobar barbazfoobar foobaz barbaz


注意,使用 Raku 正規表示式:overlap使用(或:ov) 參數/副詞偵測兩個重疊的字串。請參閱下面的第一個連結。


https://docs.raku.org/language/regexes#Overlap
https://docs.raku.org/language/regexes
https://raku.org

相關內容