使用SED删除不匹配的行

时间:2015-09-22 00:51:13

标签: regex linux bash awk sed

我尝试删除除了3条具有特定匹配模式的单独行以外的所有内容,只留下我想要的3行

这是我的代码;

sed -n '/matching pattern/matching pattern/matching pattern/p' > file.txt

5 个答案:

答案 0 :(得分:3)

如果同一行有多个命令,则需要用;分隔命令:

sed -n '/matching pattern/p;/matching pattern2/p;/matching pattern3/p' file

或者你可以将它们放在不同的行上:

sed -n '/matching pattern/p
        /matching pattern2/p
        /matching pattern3/p' file

除此之外,您还可以使用正则表达式替换:

sed -rn '/(pattern|pattern2|pattern3)/p' file

或(更好)使用grep

grep -E '(pattern|pattern2|pattern3)' file

但是,如果模式越来越复杂,这可能会变得混乱。

答案 1 :(得分:2)

要求救援!

awk '/pattern1/ || /pattern2/ || /pattern3/' filename

我认为它比替代品更清洁。

答案 2 :(得分:2)

Sed with Deletion

总有不止一种方法可以做这种事情,但一种有用的sed编程模式是使用交替删除。例如:

# BSD sed
sed -E '/root|daemon|nobody/!d' /etc/passwd

# GNU sed
sed -r '/root|daemon|nobody/!d' /etc/passwd

这样可以表达诸如"删除所有除了所列出的条款之类的想法。"即使表达在功能上是等价的,使用与您试图传达的想法最匹配的构造也会很有帮助。

答案 3 :(得分:1)

这可能适合你(GNU sed):

sed '/pattern1/b;/pattern2/b;/pattern3/b;d' file

sed的正常流程是打印处理后残留在图案空间中的内容。因此,如果所需的模式位于模式空间中,则让sed执行其操作,否则删除该行。

N.B。 b命令类似于goto,如果它没有以下标识符,则意味着中断任何其他sed命令并打印(如果-n选项正在运行,则不打印)模式空间的内容。

答案 4 :(得分:0)

如果我理解正确的话:

>>> with open('myfile.txt', 'r') as fh:
...     for l in fh.readlines():
...         for pair in l.strip().split("&"):
...             k, v = pair.split("=")
...             print k, v

'phone', '408-456-7890'
'param1', '2'
'param2', '12'
'param3', '0'