我需要打印两个分隔符之间的行。例如,给定输入
fluff1
fluff2
BEGIN
good3
good4
END
fluff5
fluff6
BEGIN
good7
good8
END
more fluff
我想要的输出是
good3
good4
good7
good8
我知道如何使用awk
,但希望找到一个更短的解决方案sed
。
我希望它是以下内容,但这当然是无效的语法:
sed -n '/BEGIN/+1,/END/-1p'
答案1
sed -n -e '/^BEGIN$/,/^END$/{/^BEGIN$/d;/^END$/d;p;}' input
答案2
使用 GNU sed
3.95 或更高版本,您可以执行以下操作:
sed '/^BEGIN$/,/^END$/!d;//d'
对于其他sed
的,你可能必须这样写:
sed '/^BEGIN$/,/^END$/!d;//d;/^BEGIN$/d'
甚至
sed '/^BEGIN$/,/^END$/!d;/^END$/d;/^BEGIN$/d'
就像 busybox 一样sed
。
另请参阅sed 常见问题解答
答案3
如果你不想重复分隔符,你可以使用 Perl:
perl -ne '/BEGIN/ && do {$a=1; next}; $a=0 if /END/; print if $a' input
您还可以修改 HaukeLaging 的回答使用变量:
b="BEGIN"; e="END"; sed -n -e "/^$b$/,/^$e$/{/^$b$/d;/^$e$/d;p}" input
答案4
或者,要包含您可以执行的分隔符sed -ne "/BEGIN/,/END/{p;}" $INPUT