当找到指定行时,如何将列表中的行添加到另一个文件中?

当找到指定行时,如何将列表中的行添加到另一个文件中?

基本上我有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

这是另一个简短的解决方案seded

它修改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 行添加的波形符~

相关内容