Sed在两个字符串之间提取文本

ran*_*111 8 regex shell awk sed

请帮我使用sed.我有一个如下文件.

START=A
  xxxxx
  xxxxx
END
START=A
  xxxxx
  xxxxx
END
START=A
  xxxxx
  xxxxx
END
START=B
  xxxxx
  xxxxx
END
START=A
  xxxxx
  xxxxx
END
START=C
  xxxxx
  xxxxx
END
START=A
  xxxxx
  xxxxx
END
START=D
  xxxxx
  xxxxx
END
Run Code Online (Sandbox Code Playgroud)

我想在START = A,END之间得到文本.我使用了以下查询.

sed '/^START=A/, / ^END/!d' input_file
Run Code Online (Sandbox Code Playgroud)

这里的问题是,我得到了

START=A
  xxxxx
  xxxxx
END
START=D
  xxxxx
  xxxxx
END
Run Code Online (Sandbox Code Playgroud)

代替

START=A
  xxxxx
  xxxxx
END
Run Code Online (Sandbox Code Playgroud)

塞德贪婪地发现.

请帮我解决这个问题.

提前致谢.

我可以使用AWK实现上述目标吗?

Jon*_*ler 24

sed -n '/^START=A$/,/^END$/p' data
Run Code Online (Sandbox Code Playgroud)

-n选项意味着默认情况下不打印; 然后脚本说'在包含START=A和下一行之间打印END.

您也可以这样做awk:

模式可以由用逗号分隔的两个模式组成; 在这种情况下,通过第二图案的出现,从第一图案的出现开始对所有行执行动作.

(来自man awkMac OS X).

awk '/^START=A$/,/^END$/ { print }' data
Run Code Online (Sandbox Code Playgroud)

鉴于问题中数据文件的修改形式:

START=A
  xxx01
  xxx02
END
START=A
  xxx03
  xxx04
END
START=A
  xxx05
  xxx06
END
START=B
  xxx07
  xxx08
END
START=A
  xxx09
  xxx10
END
START=C
  xxx11
  xxx12
END
START=A
  xxx13
  xxx14
END
START=D
  xxx15
  xxx16
END
Run Code Online (Sandbox Code Playgroud)

使用GNU sed或Mac OS X(BSD)sed以及使用GNU awk或BSD的输出awk是相同的:

START=A
  xxx01
  xxx02
END
START=A
  xxx03
  xxx04
END
START=A
  xxx05
  xxx06
END
START=A
  xxx09
  xxx10
END
START=A
  xxx13
  xxx14
END
Run Code Online (Sandbox Code Playgroud)

请注意我是如何修改数据文件的,以便更容易查看打印的各种数据块来自文件的位置.

如果你有不同的输出要求(例如'只有START = A和END'之间的第一个块,或'只有最后一个......'),那么你需要在问题中更清楚地表达出来.