簡體   English   中英

使用 sed 或通過匹配多行來編輯 xml 文件

[英]edit xml file using sed or something by matching over multiple lines

我想“編輯”一些 xml 文件,這些文件可能在一個文件中多次包含類似的部分。 我需要在每個部分中添加 2 條可能的缺失行(我稱之為一對)。即檢查“對”是否存在,如果不存在則添加它們。

例如,下面是我想添加的可能缺少的對行。

<arg>--possibleMissedKey</arg>
<arg>possibleMissedValue</arg>

下面的文件有這對,所以我不需要添加它們,但如果任何部分確實錯過了這對,我想將這對添加到該部分中。每個部分中的行數也不是可預見。


    <some-tag-section-not-interesting>
        some contents not interesting to me
    </some-tag-section-not-interesting>
    <some-tag-to-look-for>
        <some stuff - a> ..... </some stuff - a>
        <arg>--possibleMissedKey</arg>
        <arg>possibleMissedValue</arg>
        <something-else-not-interesting>blahblah</something-else-not-interesting>
    </some-tag-to-look-for>
    <some-tag-to-look-for>
        <some stuff - b>....</some stuff - b>
        <arg>--possibleMissedKey</arg>
        <arg>possibleMissedValue</arg>
        <something-else-not-interesting>blahblah</something-else-not-interesting>
    </some-tag-to-look-for>

所以我考慮了幾個選項,但每個選項我都有一個問題:

  • 我首先想到的是'sed'。 我希望將結束標記</some-tag-to-look-for>替換為

        <arg>--possibleMissedKey</arg>
        <arg>possibleMissedValue</arg>
     </some-tag-to-look-for> 

即基本上將其添加到本節的最后一部分。 但我不知道我是否可以在 sed 中“多行模式匹配” 而且我沒有使用所謂的“保持空間”。 我對 sed 的經驗是檢查“當前單行”中的一些字符串。

  • 我希望檢查的另一個選項是引入inside_a_section_flag ,初始值為“0”。 開始閱讀文件,當我發現一個凝視的<some-tag-to-look-for>時,我將inside_a_section_flag為'1',一旦我到達'結尾</some-tag-to-look-for> ',我做了一些可能的改變,然后把它變回'0'。 所以這個inside_a_section_flag ,如果它是 1,意味着我在這個部分里面......所以我需要尋找“pair”,如果我找到了那對,我將inside_a_section_flag設置為 1,這意味着我不需要添加這對並可以退出當前部分....但我不知道sed 是否也可以使用變量標志,即根據變量值進行條件替換/更改

  • 這是否應該由 shell 完成,而不應該由 python 腳本完成?

這可能對您有用(GNU sed):

sed '/<some-tag-to-look-for>/{:a;n;/<arg>--possibleMissedKey<\/arg>/b;/<\/some-tag-to-look-for>/!{h;ba};x;s/\S.*/<arg>--possibleMissedKey<\/arg>/p;s//<arg>--possibleMissedValue<\/arg>/p;x}' file

匹配包含<some-tag-to-look-for>行。

循環遍歷以下行。

如果遇到包含<arg>--possibleMissedKey</arg>的行,則退出。

否則,如果當前行不匹配</some-tag-to-look-for> ,請復制並重復。

當找到結束標記時,以復制的行為模板插入所需的兩行(以保留縮進)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM