我有下面的 xml 文件
cat example.xml
<?xml version="1.0" encoding="UTF-8"?>
<TestConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Text>
<Checking state="BOOT" />
<function name="configure" type="test" username="user1" num="1" Mode="NA" Type="OPEN" txt="NA-TO" TextType="guest" who="BANANNA"/>
<function name="configure" type="test" username="user2" num="2" Mode="YA" Type="DYNAMIC-WEP" txt="NA-TO" TextType="employee" who="BANANNA" />
<function name="configure" type="test" username="user3" num="3" Mode="YA" Type="DYNAMIC-WEP" txt="NA-TO" TextType="employee" who="BANANNA"/>
<function name="configure" type="test" username="user4" num="4" Mode="YA" Type="WPA2-PSK" txt="CA-TO" TextType="employee" who="BANANNA">
<parameters name="_key" value="password" isit="true" />
</function>
<function name="configure" type="test" username="user5" num="5" Mode="YA" Type="WPA2-PSK" txt="CA-TO" TextType="employee" who="BANANNA">
<parameters name="_key" value="password" isit="true" />
</function>
<function name="configure" type="test" username="user6" num="7" Mode="YA" Type="WPA2-PSK" TextType="employee" who="BANANNA">
<parameters name="_key" value="password" isit="true" />
</function>
</Text>
</TestConfig>
在此文件中,我想将第 5 行更改为
<function name="configure" type="test" username="user1" num="1" Mode="NA" Type="OPEN" txt="NA-TO" TextType="guest" who="BANANNA"/>
到
<function name="configure" type="test" username="user1" num="1" Mode="YA" Type="WPA2-PSK" txt="NA-TO" TextType="guest" who="BANANNA">
<parameters name="_key" value="password" isit="true" />
</function>
答案1
awk 'NR!=5{print} NR==5{ print " <function name=\"configure\" type=\"test\" username=\"user1\" num=\"1\" Mode=\"YA\" Type=\"WPA2-PSK\" txt=\"NA-TO\" TextType=\"guest\" who=\"BANANNA\">"; print " <parameters name=\"_key\" value=\"password\" isit=\"true\" />"; print ""}' /path/to/some.xml
答案2
不要使用正则表达式来解析或编辑 XML。它不能可靠地工作,也不能使其可靠地工作 - 即使您确实修改了一些“有效”的东西,即使输入 XML 文件中的微小更改或意外变化也可能会破坏任何仅正则表达式的脚本。
相反,请使用:
- 一种编程语言,例如
perl
或python
(或许多其他),具有 XML 解析库。 - 像这样的命令行工具xmlstarlet,它可以为大多数 Linux 发行版和其他类 UNIX 系统预先打包。
如果你确实必须使用sed
or awk
,那么使用XML2将 XML 数据转换为适合使用此类工具处理的面向行的格式,然后2xml
将其转换回正确格式的 XML。例如
xml2 < yourxmlfile | your sed/awk script here | 2xml > newxmlfile
答案3
创建新文件 newcontent.txt。放入你想要替换的内容。
Cat new content.txt
<function name="configure" type="test" username="user1" num="1" Mode="YA" Type="WPA2-PSK" txt="NA-TO" TextType="guest" who="BANANNA">
<parameters name="_key" value="password" isit="true" />
</function>
使用以下命令根据您的要求替换内容
sed '5r newcontent.txt' example2.txt | sed ‘5d'.
example2.txt==> 原始输入文件
newcontent.txt==> 包含需要替换的内容
输出
<?xml version="1.0" encoding="UTF-8"?>
<TestConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Text>
<Checking state="BOOT" />
<function name="configure" type="test" username="user1" num="1" Mode="YA" Type="WPA2-PSK" txt="NA-TO" TextType="guest" who="BANANNA">
<parameters name="_key" value="password" isit="true" />
</function>
<function name="configure" type="test" username="user2" num="2" Mode="YA" Type="DYNAMIC-WEP" txt="NA-TO" TextType="employee" who="BANANNA" />
<function name="configure" type="test" username="user3" num="3" Mode="YA" Type="DYNAMIC-WEP" txt="NA-TO" TextType="employee" who="BANANNA"/>
<function name="configure" type="test" username="user4" num="4" Mode="YA" Type="WPA2-PSK" txt="CA-TO" TextType="employee" who="BANANNA">
<parameters name="_key" value="password" isit="true" />
</function>
<function name="configure" type="test" username="user5" num="5" Mode="YA" Type="WPA2-PSK" txt="CA-TO" TextType="employee" who="BANANNA">
<parameters name="_key" value="password" isit="true" />
</function>
<function name="configure" type="test" username="user6" num="7" Mode="YA" Type="WPA2-PSK" TextType="employee" who="BANANNA">
<parameters name="_key" value="password" isit="true" />
</function>
</Text>
</TestConfig>