基本上我有2个文件。其中有一个路由器和交换机登录提示列表,如下所示:
user@router1
user@router2
user@switch1
user@switch2
另一个文件有 XML 块,如下所示:
<headTag>
<anotherTag1>
<anotherTag2>
</anotherTag2>
</anotherTag1>
</headTag>
<headTag>
<anotherTag1>
<anotherTag2>
</anotherTag2>
</anotherTag1>
</headTag>
所以我想要做的是,我需要循环遍历 XML 文件,每次检测到时,<headTag>
将路由器/交换机列表上的下一个项目放在其上方的行上,因此最终输出将如下所示:
user@router1
<headTag>
<anotherTag1>
<anotherTag2>
</anotherTag2>
</anotherTag1>
</headTag>
user@router2
<headTag>
<anotherTag1>
<anotherTag2>
</anotherTag2>
</anotherTag1>
</headTag>
我怎样才能实现这个目标?我正在使用 Red Hat Enterprise Linux Server,路由器/交换机列表中有大约 800 个项目以及相同数量的 XML 块。
答案1
它修改XML文件到位。忽略控制台的输出。
sed -e 's#.*#/<headTag>/i\n&\n.\n//\nw#' PATH_TO_LIST_FILE | ed PATH_TO_XML_FILE
命令sed
行为列表文件中的每一行写入以下 Ed 命令:
/<headTag>/i # search for tag and insert before
user@router1 # text to insert (= the current line in the list file)
. # end of insert
// # skip current tag (we are now on the line above the current tag))
w # save (could be postponed to the end, but makes the command shorter...)
对于此命令,需要<headTag>
始终位于 xml 文件中行的开头。
答案2
干得好:
perl -MTie::File -e '
$xml_file_name="path_to_xml_file";
$list_file_name="path_to_list_file";
tie @xml_lines,"Tie::File",$xml_file_name;
tie @list_lines,"Tie::File",$list_file_name;
@offsets = grep {$xml_lines[$_]=~/\Q<headTag>\E/} (0..$#xml_lines);
@offsets=reverse @offsets;
splice @xml_lines,pop @offsets,0,pop @list_lines;'
免责声明
- 此代码将就地修改您的 XML 文件。如果您不想破坏原始文件,请制作备份副本。
- 这段代码是未经测试的。在尝试之前备份这两个文件。
编辑
修正了一个拼写错误:请注意第 6 行添加的波形符~
。