【问题标题】:Replace string among two lines with sed command用 sed 命令替换两行之间的字符串
【发布时间】:2022-10-24 05:00:11
【问题描述】:

我有一个 xml 文件,我想在其中执行 sed 命令来删除一些字符串,

我这里有一部分文件:

<?xml version="1.0" ?>
<DataPDU
    xmlns:ns2="urn:swift:saa:xsd:saa.2.0">
    <DbtrAcct>
        <Id>
            <Othr>
                <Id>1234567890</Id>
            </Othr>
        </Id>
    </DbtrAcct>
    <CdtrAcct>
        <Id>
            <Othr>
                <Id>1000002233250</Id>
            </Othr>
        </Id>
    </CdtrAcct>
    <Dt>
        <Dt>2022-10-05</Dt>
    </Dt>
</DataPDU>

我需要从这个文件中删除标签&lt;Id&gt;&lt;Dt&gt;,但只有当它们内部有相同的标签时,当这种情况发生时,我需要删除其中一个标签。得到一个看起来像这样的文件:

<?xml version="1.0" ?>
<DataPDU
    xmlns:ns2="urn:swift:saa:xsd:saa.2.0">
    <DbtrAcct>
            <Othr>
                <Id>1234567890</Id>
            </Othr>
    </DbtrAcct>
    <CdtrAcct>
            <Othr>
                <Id>1000002233250</Id>
            </Othr>
    </CdtrAcct>
    <Dt>2022-10-05</Dt>
</DataPDU>

(这里并排,以便更好地阅读:)

为此,我尝试使用如下命令(我现在只关注&lt;Id&gt;

sed -i "s/<DbtrAcct>[^<>]*<Id>/<Id>/g" file.xml 

我试图用这个替换由&lt;DbtrAcct&gt; + &lt;Id&gt; 形成的字符串,然后用&lt;Id&gt; 替换它,但我在寻找这些时遇到了问题,因为它们不在同一行(至于我知道sed 当时只读取一行)。

我该怎么做才能实现我在这里需要的东西,我对这种类型的操作不太了解,但我认为这可能满足我的需要。

(我的第二部分是当我替换文件的结束标签时如何转义结束标签中的“/”)

我也对其他选项持开放态度,例如 awk 即使有回声,如果值得的话,

我一直在尝试使整个文件成为一行,然后删除,然后将其设置为 xml 格式,但没有运气

【问题讨论】:

    标签: sed


    【解决方案1】:

    这可能对您有用(GNU sed):

    sed -E '/^s*<(Id|Dt)>/{:a;N;/^(s*<)(S+>).*
    //!ba;s/^s*(<S+>)[^
    ]*
    (.*.*)
    .*//}' file
    

    如果一行以&lt;Id&gt;&lt;Dt&gt; 开头,则在同一缩进处收集下一行直到其结束标记。

    如果该集合包含另一个相同类型的标签,请删除该集合的开始行和结束行。

    【讨论】:

    • 谢谢你,我试过运行它,但它没有修改文件,它列出了整个文件但没有改变任何东西,有什么我应该注意的吗? (对不起,我不太明白你的命令)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多