空行作为 SED 结束范围模式

空行作为 SED 结束范围模式

尝试打印具有范围内匹配文本的行。如果我使用 --START-- 和 --END-- 作为范围模式,则效果很好。

$ sed -n '/--START--/{:a;N;/--END--/!ba; /Device=A/p}' file
--START--
Device=A
Data=asdfasdf
Lorem=Ipsum
--END--
--START--
Device=A
Data=asdfasdf
--END--

但是如果我用空行替换 --END-- 它就会停止工作

file:
--START--
Device=A
Data=asdfasdf
Lorem=Ipsum

--START--
Device=A
Data=asdfasdf


$ sed -n '/--START--/{:a;N;/^$/!ba; /Device=A/p}' file

我猜 sed 无法识别大括号内的空行模式。请告知如何修复命令以使用空行模式而不是 --END--

答案1

这里的问题是 - 无论它是否在大括号子表达式中 - 都/pattern/与整个模式空间匹配。一旦你有了多行模式(N例如通过使用),就不可能匹配(和^$之间至少有一个换行符)。^$

GNU sed 有一个中号ultiline 模式扩展

导致 ^ 和 $ 分别匹配(除了正常行为之外)换行符后面的空字符串和换行符之前的空字符串

$ sed -n '/--START--/{:a;N;/^$/M!ba; /Device=A/p}' file
--START--
Device=A
Data=asdfasdf
Lorem=Ipsum

否则,如果您想匹配多行模式中的尾随空行,您应该能够\n$显式使用 ex.:

$ sed -n '/--START--/{:a;N;/\n$/!ba; /Device=A/p}' file
--START--
Device=A
Data=asdfasdf
Lorem=Ipsum

相关内容