0

我在 .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 标签进行简单的查找和替换,因为这会改变嵌入在 .

任何帮助表示赞赏,谢谢!

4

2 回答 2

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>
于 2013-11-27T21:32:58.307 回答
0
sed '/^<AAAAA>/,/^<\/AAAAA>/ {
   /^<\/*AAAAA>/ s/^<\/*AAAAA>//
   /^<\/*AAAAA>/ !{
      s/^\([[:space:]]*\)<\(\/*\)BBBBB>/\1<\2AAAAA>/
      }
   }' YourFile
  1. 这适用于您的示例,因此使用 TAG 的变量来搜索/修改可能会很有用
  2. 修改后的标签(缩进)前的空格不变
  3. 包含 old 的行只是空的,但仍然存在
于 2013-11-28T07:06:26.263 回答