尝试打印具有范围内匹配文本的行。如果我使用 --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