如何用bash替换多个xml行

时间:2017-05-05 17:09:05

标签: bash sed

我是bash脚本新手。

我在文件alpha.xml中有xml标签,为

<tab>
<enabled>false</enabled>
</tab>
<tabToChange>
<enabled>false</enabled>
</tabToChange >

我试图将其改为

<tab>
<enabled>false</enabled>
</tab>
<tabToChange>
<enabled>true</enabled>
</tabToChange >

引用https://unix.stackexchange.com/questions/26284/how-can-i-use-sed-to-replace-a-multi-line-string

我试过命令

sed '/^tabToChange$/ {N; s/\<tabToChange\>n\<enabled\>/yo/g}' alpha.txt
sed '/^\<<tabToChange>\>$/ {N; s/\<<tabToChange>\>\n\<enabled\>/yo/g}' alpha.txt
sed '/^\<\<tabToChange\>\>$/ {N; s/\<\<tabToChange\>\>\n\<\<enabled\>\>/yo/g}' alpha.txt

它们都不起作用。有人可以帮助我吗

3 个答案:

答案 0 :(得分:2)

要操纵XML文档,请使用XML解析器/工具 我会使用xmlstarlet工具。 假设输入XML数据包含在父sqoop import --connect jdbc:mysql://localhost:3306/sqoopdatabase --username sqoopuser --P --table employee -m 1 --hive-database hivelearning --hive-import --hive-drop-import-delims 标记中(您将拥有自己的标记):

<root>

命令:

<root>
<tab>
<enabled>false</enabled>
</tab>
<tabToChange>
<enabled>false</enabled>
</tabToChange >
</root>

输出:

xmlstarlet ed -u "//tabToChange/enabled" -v true alpha.xml

<?xml version="1.0"?> <root> <tab> <enabled>false</enabled> </tab> <tabToChange> <enabled>true</enabled> </tabToChange> </root> - 编辑模式

ed - 更新值

-u - 匹配所需元素的xpath表达式

"//tabToChange/enabled" - 要设置的值

答案 1 :(得分:0)

我同意使用适当工具的建议。 但只是为了sed的乐趣:

sed  "/tabToChange/{N;s/\(tabToChange>\n<enabled>\)false\(<\/enabled>\)/\1true\2/;}" alpha.txt
  • 请注意<>
  • 在追加\n
  • 时,请牢记N

答案 2 :(得分:0)

您可以使用以下命令执行此操作。

<rss xmlns:a10="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
    <title>title/title>
    <link>link</link>
    <description>news</description>
    <item>
    <guid isPermaLink="true">link</guid>
    <link>link</link>
    <title>Tiele</title>
    <description>Descr</description>
    <enclosure url="image" type="image/jpeg"/>
    <a10:updated>2017-05-07T09:14:00+03:00</a10:updated>
    </item>
    </channel>
</rss>

让您在想要替换的任何行之前尊重空间。那就是我们有

cat alpha.xml | tr '\n' '\f' | sed -e '0,/<tab>\f<enabled>false<\/enabled>\f<\/tab>\f<tabToChange>\f<enabled>false<\/enabled>\f<\/tabToChange >/s//<tab>\f<enabled>false<\/enabled>\f<\/tab>\f<tabToChange>\f<enabled>true<\/enabled>\f<\/tabToChange >/'  | tr '\f' '\n' > alpha1.xml
cp alpha1.xml alpha.xml
rm alpha1.xml

我们要用

替换
<tab>
    <enabled>false</enabled>
</tab>
<tabToChange>
    <enabled>false</enabled>
</tabToChange >

要使用的命令是:

<tab>
    <enabled>false</enabled>
</tab>
<tabToChange>
    <enabled>true</enabled>
</tabToChange >

请注意,我们尊重cat alpha.xml | tr '\n' '\f' | sed -e '0,/<tab>\f <enabled>false<\/enabled>\f<\/tab>\f<tabToChange>\f <enabled>false<\/enabled>\f<\/tabToChange >/s//<tab>\f <enabled>false<\/enabled>\f<\/tab>\f<tabToChange>\f <enabled>true<\/enabled>\f<\/tabToChange >/' | tr '\f' '\n' > alpha1.xml cp alpha1.xml alpha.xml rm alpha1.xml 之前的4个标签。