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)
假设这是一个格式良好的 XML 文档,下面使用 XMLStarlet 来挑选info_id
值为的节点6
,然后是紧随其后的兄弟节点info1
和info2
节点:
$ 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)