如何使用sed替换文件中的n次出现?

时间:2013-04-30 07:53:56

标签: shell unix sed

我正在开发shell脚本和自动化,我想在不编写更多代码的情况下完成cetain任务。

下面是Web服务的示例xml,我希望在每个段中更改startdate时命中以下请求(Data.xml)。

表示在第一次调用时,只会修改First标记的startdate,并且其余的startdate将保持不变等等。

我的方法是删除所有换行符并在一行中形成整个xml,然后使用sed替换所需的事件。

我尝试使用以下命令

cat Data.xml | awk '{ print $1}'| xargs  echo | sed 's/<startdate>01011970<\/startdate>/<startdate>01011979<\/startdate>/2' | sed 's/> </>\n</g'

输出:

<Data>
<First>
<Name>Micheal</Name>
<Account-Validation>
<startdate>01011970</startdate>
<enddate>01019999</enddate>
</Account-Validation>
</First>
<Second>
<Name>Adam</Name>
<Account-Validation>
<startdate>01011979</startdate>
<enddate>01019999</enddate>
</Account-Validation>
</Second>
<Third>
<Name>Raul</Name>
<Account-Validation>
<startdate>01011970</startdate>
<enddate>01019999</enddate>
</Account-Validation>
</Third>
</Data>

我看到的唯一问题是它改变了整个xml格式。所以我正在寻找使用保持缓冲区和模式缓冲区方法做同样的事情。 这是示例命令,

cat Data.xml | sed  '{/<Second>/,/<\/Second>/g;s/<startdate>01011970<\/startdate>/<startdate>01011979<\/startdate>/p};h;

但是上面不起作用,所以任何人都可以使用保持缓冲区和模式缓冲区方法来帮助我这样做。我看到使用这种方法的优点是你不需要计算没有发生,你可以很容易地提供标签名称只在其中替换startdate。

data.xml中

<Data>
        <First>
                        <Name>Micheal</Name>
                        <Account-Validation>
                                <startdate>01011970</startdate>
                                <enddate>01019999</enddate>
                        </Account-Validation>
        </First>
        <Second>
                        <Name>Adam</Name>
                        <Account-Validation>
                                <startdate>01011970</startdate>
                                <enddate>01019999</enddate>
                        </Account-Validation>
        </Second>
        <Third>
                        <Name>Raul</Name>
                        <Account-Validation>
                                <startdate>01011970</startdate>
                                <enddate>01019999</enddate>
                        </Account-Validation>
        </Third>
</Data>

谢谢, Priyank Shah

1 个答案:

答案 0 :(得分:1)

命令不起作用的原因是:您正确选择地址空间,但不执行任何操作。 &#39; S&#39;命令必须在地址空间内。

示例:

sed '/<Second>/,/<\/Second>/{s/<startdate>01011970<\/startdate>/<startdate>01011979<\/startdate>/}' Data.xml
当你只执行一个这样的命令时,

{}括号是可选的。