我想获取系统 xinitrc 除了本地 xinitrc 中的最后一段之外,所以我使用
% sed -n 'H
/^exec ./{
x
s/\([^\n]\+\n\)\+exec.*//
p
}' /etc/X11/xinit/xinitrc
也就是说,当^exec
遇到 时,我会打印除 exec 行及其段落的上述部分之外的所有内容。
我的问题是:这可以做得更简单吗?例如,是否可以在不使用保留空间的情况下完成?我尝试使用 N,但无法使其按预期工作。
答案1
在 中sed
,“及其段落的上述部分”基本上意味着是。如果你想根据后面几行的内容决定是否打印行,你几乎必须使用缓冲区,除非你可以重构你的范式。
“段落”的定义是什么?是否一致?perl
并awk
允许您定义相当任意的记录分隔符。你可以尝试这样的事情:
$: awk 'BEGIN{ RS="if " }
/exec/{ exit; }
{ print }
' /etc/X11/xinit/xinitrc
不过,我建议研究您的数据以获得更好的分隔符。