我通过论坛阅读了如何解决我的问题的线索,但是没有任何相关的线程可用于我,具有有限的编程知识,可以应用于我的具体问题。
我的问题是:我需要摆脱整个文件中聚集的垃圾行,但是在可用行集群之间。我搜索了有关删除匹配模式的范围的sed手册和其他信息来源,但他们只提到删除UNTIL匹配模式,而不是TILL。
现在我想指定一个范围,sed从第一行开始删除与模式行匹配的行,直到与其他模式匹配的行。此外,sed需要识别行末的模式。
例如:
line 1
blah blah 1
blah blah 2
blah blah 3
blah blah 4
line 2
line 3
结果必须是:
line 1
blah blah 1
line 2
line 3
请注意线和线2之间的多条线。虽然需要保留blah blah 1,但需要删除其他3条线。
谢谢!
答案 0 :(得分:13)
试试这个
sed -n '/line 1/{;p;n;p;};/line 2/,$p' sedTest1.txt
#output
line 1
blah blah 1
line 2
line 3
Sed解构:
sed -n '/line 1/{;p;n;p;};/line 2/,$p' sedTest1.txt
| | | | |||-> print the range
| | | | ||-> til end of file (the '$' char)
| | | | |-> range operator (i.e. start,end)
| | | |-> beginning of range to watch for and print
| | |-> now print line, get 'n'ext, print that line
| |-> match the line with text 'line 1'
|-> don't print every line, only ones flagged with 'p'
从下往上阅读。
此外,由于您的数据是样本,并且您将其称为垃圾行,因此可能不是这么简单。 您需要查看sed教程以加快速度。
我希望这会有所帮助。
答案 1 :(得分:1)
这可能对您有用:
sed '/line 1/,/line 2/{//!d;/line 1/N}' file
line 1
blah blah 1
line 2
line 3
或者这个(如果范围不连续):
sed '/line 1/,/line 2/{//!d;$!N}' file
line 1
blah blah 1
line 2
line 3
答案 2 :(得分:0)
$ sed -n '/line 1/{p;n;p;:a;n;/line 2/{:c;p;n;bc};ba};p' input.txt
line 1
blah blah 1
line 2
line 3