SED(或其他发现和替换);改变嵌入式标签

时间:2013-11-27 17:38:25

标签: xml regex replace sed findandmodify

我在.xml文件中有这么多格式的实例:

<FFFFF>
    <BBBBB>
         "good B data"
    </BBBBB>
    <BBBBB>
         "more good B data"
    </BBBBB>
</FFFFF>


<AAAAA>
    <BBBBB>
         "some data"
    </BBBBB>
    <BBBBB>
         "more B data"
    </BBBBB>
</AAAAA>

我正在尝试删除A标记,并重命名A标记中的B标记;所以最终的结果是:(请注意,将B标签重命名为任何标签也没关系,它们就不能再为B了)

<FFFFF>
    <BBBBB>
         "good B data"
    </BBBBB>
    <BBBBB>
         "more good B data"
    </BBBBB>
</FFFFF>

 <AAAAA>
      "some data"
 </AAAAA>
 <AAAAA>
      "more B data"
 </AAAAA>

我一直在搞乱sed,但我无法弄清楚如何做到这一点。每个A中没有固定数量的B标签(有些没有,有些可能有20个,等等)。另一个问题是我不想删除其他地方存在的B标签;所以我不能在B标签上进行简单的查找和替换,因为这会改变嵌入的标签。

感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分:1)

$ cat file
<FFFFF>
    <BBBBB>
         "good B data"
    </BBBBB>
    <BBBBB>
         "more good B data"
    </BBBBB>
</FFFFF>


<AAAAA>
    <BBBBB>
         "some data"
    </BBBBB>
    <BBBBB>
         "more B data"
    </BBBBB>
</AAAAA>

$ cat tst.awk
BEGIN{ remove="AAAAA"; changeFrom="BBBBB"; changeTo="XXXXX" }

$1 ~ "^<" remove ">$" {
    inRemove = 1
    next
}

inRemove {
    if ($1 ~ "^</" remove ">$") {
        inRemove = 0
        next
    }
    else if ($1 ~ "^</?" changeFrom ">$") {
        sub(changeFrom,changeTo)
    }
    sub(/^    /,"")
}

{ print }

$ awk -f tst.awk file
<FFFFF>
    <BBBBB>
         "good B data"
    </BBBBB>
    <BBBBB>
         "more good B data"
    </BBBBB>
</FFFFF>


<XXXXX>
     "some data"
</XXXXX>
<XXXXX>
     "more B data"
</XXXXX>

答案 1 :(得分:0)

sed '/^<AAAAA>/,/^<\/AAAAA>/ {
   /^<\/*AAAAA>/ s/^<\/*AAAAA>//
   /^<\/*AAAAA>/ !{
      s/^\([[:space:]]*\)<\(\/*\)BBBBB>/\1<\2AAAAA>/
      }
   }' YourFile
  1. 这是针对您的样本所以也许使用变量进行TAG搜索/修改
  2. 修改后的标签(缩进)前面的空格不变
  3. 包含旧的行只是空的但仍然存在