删除除两种模式之外的所有内容

时间:2014-03-23 16:47:52

标签: sed

有没有办法在bash中删除除TWO模式之外的所有内容?

我知道我可以使用

删除除模式之外的所有内容
sed '/pattern/!d'

但是我正在寻找一种方法来删除除了两种模式之外的所有模式......就像这样

sed '/pattern1 and pattern2/!d'

我不知道该怎么做。

顺便说一句。我正在尝试删除除< ..>之外的所有内容和< ..>:

感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

您要删除所有不包含pattern1 pattern2的行。为此使用正确的OR。

$ cat in.txt
foo
bar
baz
qux
$ sed '/foo\|bar/!d' < in.txt
foo
bar

答案 1 :(得分:1)

更好地回答我之前的情况。假设您的模式位于grep并且您的输出位于in.txt

,则可以使用out.txt执行此任务
grep -E -o '(pattern1|pattern2) in.txt > out.txt' 

E用于扩展正则表达式,o仅用于显示匹配模式。

答案 2 :(得分:1)

而不是!d您可以使用-np命令:

sed -n '/pattern1/p; /pattern2/p' 

除GNU sed之外的其他seds也适用...

答案 3 :(得分:1)

您可以使用awksed执行此操作。

$ cat file
foo
bar
baz
qux
$ sed -n '/foo\|bar/p' file
foo
bar
$ awk '/foo|bar/' file
foo
bar

以上内容将打印包含foobar的所有行。如果您希望更具体,例如,只有在foobar位于行首时才打印,您可以使用^,这意味着只打印那些以你的模式。