使用sed命令替换xml标记

时间:2015-07-17 14:06:11

标签: xml shell replace sed

在一个项目中我有一个info.plist(xcode项目)文件,它是一个xml文件。我想在终端上使用shell脚本为它添加更多属性。

我需要添加的内容如下:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>CFBundleURLName</key>
        <string>com.myapp.test</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>test-scheme</string>
        </array>
    </dict>
</array>

在做了一些研究之后,我发现这样做的方法是使用sed

我将使用sed命令替换第一次出现的< dict >标记,该标记始终位于info.plist文件中,并带有上述代码(并重新添加{{1}在它开始时所以我不打破结构。

This Stackoverflow answer的帮助下,我将以下命令放在一起:

< dict >

理论上,该命令应该替换第一次出现的`&lt; dict&gt;&#39;标记自己+我要添加的文本,没有换行符。我也跳过了

然而,当我运行它时,我收到以下错误:

sed ‘0,/<dict>/{s/<dict>/<dict><key>CFBundleURLTypes<\/key><array><dict><key>CFBundleTypeRole<\/key><string>Viewer<\/string><key>CFBundleURLName<\/key><string>com.myapp.test<\/string><key>CFBundleURLSchemes<\/key><array><string>test-scheme<\/string><\/array><\/dict><\/array>/}’ info.plist

我做错了什么?有什么我应该做的才能使这项工作?我试过跳过所有&lt;和&gt;没有成功。

非常感谢任何帮助。

修改

正如JJoao的评论中所建议的,我尝试用sed&#39; ...&#39;替换sed'...',现在我收到以下错误:

-bash: syntax error near unexpected token `<' 

EDIT2

有关详细说明,这是我想要的输出:

我有一个xml文件,其中包含以下内容:

sed: 1: "0,/<dict>/{s/<dict><key ...": unterminated substitute in regular expression

我想插入我在开始时指定的xml部分。所以输出将是:

<?xml version="1.0" encoding="utf-8"?>
<plist version="1.0">
    <dict>
        <key>CFBundleDevelopmentRegion</key>
        <string>en</string>
        .........
    </dic>
</plist>

或者以更清洁的方式写出来:

<?xml version="1.0" encoding="utf-8"?>
<plist version="1.0">
    <dict><key>CFBundleURLTypes</key><array><dict><key>CFBundleTypeRole</key><string>Viewer</string><key>CFBundleURLName</key><string>com.myapp.test</string><key>CFBundleURLSchemes</key><array><string>test-scheme</string></array></dict></array>
        <key>CFBundleDevelopmentRegion</key>
        <string>en</string>
        .........
    </dic>
</plist>

1 个答案:

答案 0 :(得分:1)

perl -p表现得像sed; perl -p0读取info.plist文件的所有行

用法:perl changedict info.plist

#!/usr/bin/perl -p0

my $new='
        <key>CFBundleURLTypes</key>
        <array>
            <dict>
                <key>CFBundleTypeRole</key>
                <string>Editor</string>
                <key>CFBundleURLName</key>
                <string>com.myapp.test</string>
                <key>CFBundleURLSchemes</key>
                <array>
                    <string>test-scheme</string>
                </array>
            </dict>
        </array>';

s!<dict>!<dict>$new!;

更新:以前的版本正在写入标准输出; 您可以将其重定向到新文件perl changedict info.plist > newinfo.plist

如果您需要infile替换,请将第一行更改为

#!/usr/bin/perl -pi0