【问题标题】:search patten between xml tags and replace parts of it在 xml 标签之间搜索 patten 并替换它的一部分
【发布时间】:2014-12-09 14:14:05
【问题描述】:

我正在尝试替换以下标签之间的字符串 原件:

...<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>..

我必须搜索所有带有“&lt;”或“&gt;”的元素,并将它们替换为“&amp;amp;lt;”或“&amp;amp;gt;”,但前提是这些元素介于“&lt;Data ss:Type="String"&gt;”和“&lt;/Data&gt;”。模式必须包括多行搜索。 “&lt;Data..”不在行首,“&lt;/Data&gt;”不在行尾 类型通常是字符串,但也可以是其他类型。

我试过了

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

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

有人知道如何解决它吗? 谢谢!

【问题讨论】:

  • 您需要一个双重正则表达式来执行此操作。一个抓取内容,一个替换内容。

标签: xml regex awk sed


【解决方案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>

如果您不想要换行符,请在 BEGIN 中设置 ORS=""

【讨论】:

  • 谢谢@WYSIWYG!而不是替换我需要搜索这部分字符串(子字符串)并将&lt;&gt;替换为&amp;amp;lt;&amp;amp;gt;
  • 嗨,这个命令是完美的,谢谢!我使用以下命令扩展它sed -e 's/&lt;amp;lt/amp;lt/g' | sed -e 's/&gt;amp;gt/amp;gt/g' &gt;$outputfile thx!
  • 但我想这不是必需的,因为没有像&gt;amp;gt 这样的模式。无论如何,您可以组合这两个 sed 命令 - 只需在两个语句之间放置一个 ;
猜你喜欢
  • 2015-09-04
  • 2021-02-05
  • 2018-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多