ram*_*amp 1 xml sed shell-script
我有一个很小的 XML 文件。我已经被提供了,我需要做的就是在 XML 标记之间提取一些值。因为XML我的机器中没有可用的解析器实用程序。我正在寻找一种替代方法。
首先,有一个 XML 标签<capacity> </capacity> 它在 XML 文件中重复了n次,并且在这个 XML 标签之间还有许多其他不同的标签。
我必须分别获取每次出现的<capacity> </capacity>XML 标记,然后解析它并提取它们下的值。
<subcolumns><capacity><name>45.90</name>
<index>0</index>
<value_type>String</value_type>
<ignore_case_flag>1</ignore_case_flag>
<hidden_flag>0</hidden_flag>
<exclude_from_parse_flag>1</exclude_from_parse_flag>
</capacity>
<capacity><name>57.09</name>
<index>1</index>
<value_type>String</value_type>
<ignore_case_flag>1</ignore_case_flag>
<hidden_flag>0</hidden_flag>
<exclude_from_parse_flag>1</exclude_from_parse_flag>
</capacity>
<capacity><name>55</name>
<index>2</index>
<value_type>String</value_type>
<ignore_case_flag>1</ignore_case_flag>
<hidden_flag>0</hidden_flag>
<exclude_from_parse_flag>1</exclude_from_parse_flag>
</capacity>
</subcolumns>
Run Code Online (Sandbox Code Playgroud)
所以我认为的逻辑是找到<capacity> </capacity>XML 标记的第一次出现并将其打印到临时文件,然后删除第一次出现。
<capacity><name>45.90</name>
<index>0</index>
<value_type>String</value_type>
<ignore_case_flag>1</ignore_case_flag>
<hidden_flag>0</hidden_flag>
<exclude_from_parse_flag>1</exclude_from_parse_flag>
</capacity>
Run Code Online (Sandbox Code Playgroud)
此后,当第二次这样做时,<capacity> </capacity>会考虑新的XML 标记对。所以这必须重复多次,直到<capacity> </capacity>找到最后一个标签。每次提取这部分时,数据都会发生变化,并且可以提取。
现在我只想<capacity> </capacity>从主 XML 文件中选择第一次出现的XML 标记并将其打印到临时文件并删除该部分。
这就是我尝试过的,但对我没有任何效果。
sed -n '2,${/<capacity>\(.*\)<\/capacity>/\1/p;q;}' "<input XML file>" >> temp.txt
Run Code Online (Sandbox Code Playgroud)
我的进一步想法是使用该临时文件进行处理并提取我需要在capacity标签下的值。我已经为其编写了逻辑并且运行良好。
使用 XML 解析器是操作 XML 文档的正确方法。
xmlstarlet解决方案:
xmlstarlet sel -t -c '//capacity[1]' -n yourxml > temp.txt
&& xmlstarlet ed -d '//capacity[1]' yourxml > tmp.xml && mv tmp.xml yourxml
Run Code Online (Sandbox Code Playgroud)
cat temp.txt
<capacity><name>45.90</name>
<index>0</index>
<value_type>String</value_type>
<ignore_case_flag>1</ignore_case_flag>
<hidden_flag>0</hidden_flag>
<exclude_from_parse_flag>1</exclude_from_parse_flag>
</capacity>
Run Code Online (Sandbox Code Playgroud)
xmlstarlet sel -t -c '//capacity[1]' -n yourxml > temp.txt- 提取第一个capacity标签声明并将输出重定向到temp.txt
xmlstarlet ed -d '//capacity[1]' yourxml > tmp.xml-capacity从文档中删除第一个标签(通过-d删除操作)并将修改后的文档内容重定向到临时文件tmp.xml
mv tmp.xml yourxml - 用修改后的版本替换初始 xml 文档