在xml标签之间搜索patten并替换它的一部分

时间:2014-10-14 17:26:04

标签: xml regex awk sed

我试图替换以下标记之间的字符串 的原稿:

...<Cell><Data ss:Type="String">some text hmtl encoded and multiline
e.g <br /><strong>title:</strong></Data>.. ..next
element.....<Cell><Data ss:Type="String">some text hmtl encoded and
multiline e.g <br /><strong>title2:</strong></Data>..

输出:

...<Cell><Data ss:Type="String">some text hmtl encoded and multiline
e.g &amp;lt;br /&amp;gt;&amp;lt;strong&amp;gt;title:&amp;lt;/strong&amp;gt;</Data>.. ..next
element.....<Cell><Data ss:Type="String">some text hmtl encoded and
multiline e.g &amp;lt;br /&amp;gt;&amp;lt;strong&amp;gt;title2:&amp;lt;/strong></Data>..

我必须使用&#34; <&#34;来搜索所有元素。或&#34; >&#34;并将其替换为&#34; &amp;lt;&#34;或&#34; &amp;gt;&#34;,但仅限于&#34; <Data ss:Type="String">&#34;和&#34; </Data>&#34;。模式必须包括多行搜索。 &#34; <Data..&#34;不是在行的开头和&#34; </Data>&#34;不在最后 Type通常是字符串,但它可以是另一种类型。

我试过

awk '/<Data>.*<\/Data>/{sub("<","&amp;lt;",$0)} 1' $sourcefile |
awk '/<Data>.*<\/Data>/{sub(">","&amp;gt;",$0)} 1' >$outputfile

但它没有以正确的方式找到/替换它。

有人知道如何解决它? THX!

1 个答案:

答案 0 :(得分:1)

awk 'BEGIN{RS="<Data"} NR==1{print} NR>1{x=match($0,/>/);y=match($0,/<\/Data/);s=substr($0,x+1,y-x-1); gsub(/</,"\&amp;lt;",s);gsub(/>/,"\&amp;gt;",s);print RS substr($0,0,x) s substr($0,y)}' file

输出:

<Cell>
<Data ss:Type="String">some text hmtl encoded and multiline
e.g &amp;lt;br /&amp;gt;&amp;lt;strong&amp;gt;title:&amp;lt;/strong&amp;gt;</Data>.. ..next
element.....<Cell>
<Data ss:Type="String">some text hmtl encoded and
multiline e.g &amp;lt;br /&amp;gt;&amp;lt;strong&amp;gt;title2:&amp;lt;/strong&amp;gt;</Data>

如果您不想换行,请在ORS=""

中设置BEGIN