我尝试删除除了3条具有特定匹配模式的单独行以外的所有内容,只留下我想要的3行
这是我的代码;
sed -n '/matching pattern/matching pattern/matching pattern/p' > file.txt
答案 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编程模式是使用交替删除。例如:
# 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'