2013-11-27 44 views
0

我有以下格式在.xml文件许多实例:SED(或其他查找和替换);改变嵌入式标签

<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标签,因为这会改变嵌入的标签。

任何协助赞赏,谢谢!

+0

为此,您可能实际上想要在Python/Ruby/etc中使用xml解析器(它看起来像xml,无论如何)。我不认为sed本身可以解决这个问题。 – iamnotmaynard

+0

是的,它是xml;有你推荐的吗? –

+0

如果您使用Python,[美丽的汤](http://www.crummy.com/software/BeautifulSoup/)似乎是最受欢迎的。我无法想象任何Ruby的头顶,但搜索“ruby xml”应该会为你带来一堆火柴。 (编辑:Nokogiri是Ruby的一种流行解析器。) – iamnotmaynard

回答

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> 
0
sed '/^<AAAAA>/,/^<\/AAAAA>/ { 
    /^<\/*AAAAA>/ s/^<\/*AAAAA>// 
    /^<\/*AAAAA>/ !{ 
     s/^\([[:space:]]*\)<\(\/*\)BBBBB>/\1<\2AAAAA>/ 
     } 
    }' YourFile 
  1. 这是你的样品,所以也许这可能是有用的使用变量为TAG搜索/修改修改标签的前
  2. 空间(缩进)不变
  3. 包含旧的行只是空的,但仍然存在