rah*_*hmu 9 sed text-processing
如何修剪文件(井输入流),以便我只能获得从第一次出现模式foo
到最后一次出现模式的行bar
?
例如考虑以下输入:
A line
like
foo
this
foo
bar
something
something else
foo
bar
and
the
rest
Run Code Online (Sandbox Code Playgroud)
我希望这个输出:
foo
this
foo
bar
something
something else
foo
bar
Run Code Online (Sandbox Code Playgroud)
sed -n '/foo/{:a;N;/^\n/s/^\n//;/bar/{p;s/.*//;};ba};'
Run Code Online (Sandbox Code Playgroud)
sed 模式匹配/first/,/second/
逐行读取。当某些行与/first/
它匹配时,它会记住它并期待/second/
模式的第一个匹配。同时,它应用为该模式指定的所有活动。之后,该过程一次又一次地开始,直到文件末尾。
那不是我们需要的。我们需要查找/second/
模式的最后匹配。因此,我们构建只查找第一个条目的结构/foo/
。找到后,循环a
开始。我们将新行添加到匹配缓冲区N
并检查它是否与模式匹配/bar/
。如果是,我们只需打印它并清除匹配缓冲区,然后 janyway 跳转到循环的开始ba
。
我们还需要在缓冲区清理后删除换行符/^\n/s/^\n//
。我确信有更好的解决方案,不幸的是我没有想到它。
希望一切都清楚。