sed:提取行直到不匹配的模式

xav*_*avi 2 xml sed text-processing

我正在尝试从结束字符串与开始字符串不同的文件中提取行

我有以下格式的输入文件:

<item_id>6</item_id>
  <info1>abc</info1>
  <info2>123</info2>
<item_id>6</item_id>
  <info1>def</info1>
  <info2>456</info2>
<item_id>6</item_id>
  <info1>ghi</info1>
  <info2>789</info2>
<item_id>9</item_id> 
  <info1>jkl</info1>
  <info2>012</info2>
<item_id>9</item_id>
  <info1>mno</info1>
  <info2>345</info2>
Run Code Online (Sandbox Code Playgroud)

我想从“6”中提取到“9”(9 是一个随机数)

开始是 <item_id>6<\item_id>

结束是<item_id>X<\item_id>X 不是 6

预期结果:

<item_id>6</item_id>
  <info1>abc</info1>
  <info2>123</info2>
<item_id>6</item_id>
  <info1>def</info1>
  <info2>456</info2>
<item_id>6</item_id>
  <info1>ghi</info1>
  <info2>789</info2>
Run Code Online (Sandbox Code Playgroud)

我试过:

sed -n "/<item_id>6<\/item_id>/,/<item_id>!6<\/item_id>/p" input.file > output.6
sed -n "/<item_id>6<\/item_id>/,/<item_id>\!6<\/item_id>/p" input.file > output.6
sed -n "/<item_id>6<\/item_id>/,/<item_id>\{!6}<\/item_id>/p" input.file > output.6
sed -n "/<item_id>6<\/item_id>/,/<item_id>(6)\@!.<\/item_id>/p" input.file > output.6
sed -n "/<item_id>6<\/item_id>/,/<item_id>! 6<\/item_id>/p" input.file > output.6
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 5

假设这是一个格式良好的 XML 文档,下面使用 XMLStarlet 来挑选info_id值为的节点6,然后是紧随其后的兄弟节点info1info2节点:

$ xmlstarlet sel -t -m '//item_id[. = 6]' \
    -c . -nl \
    -c './following-sibling::info1[1]' -nl \
    -c './following-sibling::info2[1]' -nl file.xml
<item_id>6</item_id>
<info1>abc</info1>
<info2>123</info2>
<item_id>6</item_id>
<info1>def</info1>
<info2>456</info2>
<item_id>6</item_id>
<info1>ghi</info1>
<info2>789</info2>
Run Code Online (Sandbox Code Playgroud)

或者,忽略以下节点的名称:

xmlstarlet sel -t -m '//item_id[. = 6]' \
    -c . -nl \
    -c './following-sibling::*[1]' -nl \
    -c './following-sibling::*[2]' -nl file.xml
Run Code Online (Sandbox Code Playgroud)