使用 sed 打印开始和结束之间的行

使用 sed 打印开始和结束之间的行

我需要打印两个分隔符之间的行。例如,给定输入

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 sed3.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

相关内容