问题 Sed从特定匹配行中删除一系列行TILL特定匹配行(不包括最后一行)


我通过论坛阅读了如何解决我的问题的线索,但是没有相关的线程可用于我,具有有限的编程知识,可以应用于我的具体问题。

我的问题是:我需要摆脱整个文件中聚集的垃圾行,但是在可用行集群之间。我搜索了有关删除匹配模式的范围的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条线。

谢谢!


10510
2018-03-16 15:38


起源

格式良好的问题+1,带样本输入和所需输出。祝你好运。 - shellter


答案:


尝试这个

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教程才能加快速度。

我希望这有帮助。


13
2018-03-16 16:00



感谢您与我分享您的想法如何解决我的问题。目前我无法访问我需要测试它的服务器,但是一旦我尝试过,我会通知你。干杯, - FlyingDutch
谢谢,完美的工作,非常感谢! - FlyingDutch
很高兴有帮助。请你注意这个被接受了吗? (看到 i.imgur.com/uqJeW.png )。此外,如果您要继续使用sed,请务必阅读 grymoire.com/Unix/Sed.html 并提高您的文字处理技巧,使用awk, grymoire.com/Unix/Awk.html 。祝你好运! - shellter


这可能对你有用:

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

1
2018-03-16 16:47



是的,就像一个魅力。谢谢 - FlyingDutch


$ 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

0
2018-03-16 16:00



感谢您与我分享您的想法。我目前无法访问我的服务器来检查这是否有效,但我会回复你。干杯 - FlyingDutch