【问题标题】:How to replace n occurrences in file using sed?如何使用sed替换文件中的n次出现?
【发布时间】:2013-08-03 22:25:19
【问题描述】:

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

下面是 web 服务的示例 xml,我想在每个段中更改 startdate 来点击下面的请求(Data.xml)。

意思是在第一次调用时,只有First标签的开始日期会被修改,其余的开始日期不会改变,以此类推。

我的方法是删除所有换行符并在一行中形成整个 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;

但上面不起作用,所以任何人都可以帮助我使用保持缓冲区和模式缓冲区方法来做到这一点。我看到使用这种方法的优点是您不需要计算出现次数,您可以轻松地仅提供要替换的开始日期的标签名称。

数据.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>

谢谢, 普里扬克·沙阿

【问题讨论】:

  • 您是否考虑过使用 XSLT 来修改 XML 数据,因为使用字符串替换通常会导致可能并不总是有效的复杂模式?

标签: shell unix sed


【解决方案1】:

该命令不起作用的原因是:您正确选择了地址空间,但没有对其进行任何操作。 's' 命令必须在地址空间内。

例子:

sed '/<Second>/,/<\/Second>/{s/<startdate>01011970<\/startdate>/<startdate>01011979<\/startdate>/}' Data.xml

{} 大括号是可选的,当你像这里这样只执行一个命令时。

【讨论】:

    猜你喜欢
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    相关资源
    最近更新 更多