sed 命令将一行替换为多行而不更改文件格式

sed 命令将一行替换为多行而不更改文件格式

我有下面的 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 文件中的微小更改或意外变化也可能会破坏任何仅正则表达式的脚本。

相反,请使用:

  • 一种编程语言,例如perlpython(或许多其他),具有 XML 解析库。
  • 像这样的命令行工具xmlstarlet,它可以为大多数 Linux 发行版和其他类 UNIX 系统预先打包。

如果你确实必须使用sedor 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>

相关内容