
如果在文字檔案 ( )中找到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
in時一樣)。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嘗試先從目前工作目錄gawk
載入inplace
擴充功能(asinplace
或),有人可能已經在其中植入了惡意軟體。隨系統提供的擴展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
上面的程式碼刪除了第 9 行到第 13 行,包括foobarbaz
包含重疊 string1 和 string2 的第 13 行。如果您需要刪除按定義順序出現的字串(且不重疊),Raku 也可以做到這一點:
~$ raku -ne '.put unless m/foobar .* barbaz/;' file
上面刪除了第 9 行和第 10 行:foobar barbaz
和foobar foobaz barbaz
。
注意,使用 Raku 正規表示式能:overlap
使用(或:ov
) 參數/副詞偵測兩個重疊的字串。請參閱下面的第一個連結。
https://docs.raku.org/language/regexes#Overlap
https://docs.raku.org/language/regexes
https://raku.org