从当前行匹配到与模式不匹配的行

从当前行匹配到与模式不匹配的行

我真的尝试过搜索,但找不到任何东西(很难知道到底要搜索什么)。

我知道如何做到这一点sed:从当前行打印直到匹配某些内容的行:

sed -n '/1/,/SOMETHING/p'

但是我该如何做同样的事情,但从当前行打印到才不是匹配某些东西?

例如通过管道将其输入sed

blah blah SOMETHING blah blah
blah blah SOMETHINGblahblahblah
SOMETHING blah blah
NO MATCH HERE

然后我想过滤掉并仅打印前 3 行(但“3”可能会有所不同)。

答案1

这可能不像您真正想要的那么普遍,但这是一个起点:

 sed -n '/SOMETHING/!q;p'

这表示:检查与 的匹配/SOMETHING/。如果线不匹配(用于!反转测试结果),然后退出。否则,打印此行并继续下一行。

这不够灵活,无法立即允许您执行您要求的操作以及对文件的其他操作,所有这些都在同一个sed命令中。

答案2

您可以尝试循环sed

$ sed -n '{:loop p; n; /SOMETHING/b loop; q}' test.txt 
blah blah SOMETHING blah blah
blah blah SOMETHINGblahblahblah
SOMETHING blah blah

这:

  • :loop创建一个名为loop
  • p打印当前行
  • n获取下一行
  • /SOMETHING/b looploop如果行匹配则分支/SOMETHING/
  • q如果分支没有发生。

无论如何,这都会打印一行。 (也许可以通过 G-Man 的回答来解决。)

改编自这个问题

相关内容