【问题标题】:Removing [<] charecter from the particular tag in the xml using regex or shell使用正则表达式或外壳从 xml 中的特定标记中删除 [<] 字符
【发布时间】:2016-01-24 02:34:19
【问题描述】:

我是正则表达式的新手,如果您能对此有所了解,那就太好了。

我有一个很大的 xml 文件,它有大约 50k 行由一些第三方工具构建。

我有这样的行

<title>Apache 2.2 < 2.2.28 Multiple Vulnerabilities</title>

我只想在整个 xml 中删除此标题标签内的 &lt;

我在vimsed 中尝试了一些模式,但没有成功。

【问题讨论】:

  • 尝试(&lt;[^&lt;]*&gt;)|&lt; 并替换为第一个反向引用。
  • 您好 stribizhev,感谢您的回复,我在我的 vim 中运行此正则表达式:%s/()|/gn 将 / 替换为空但运气不佳如果我做错了我
  • 您需要替换为第一个反向引用,例如:%s/\(&lt;[^&lt;]*&gt;\)|&lt;/\1/g。我猜你需要在 vim 中使用\(...\) 来捕获子字符串。

标签: regex xml vim sed


【解决方案1】:

在 vim 中你可以这样做:

:%s@\(<title>.*\)<\(.*</title>\)@\1\2@

(其中% 表示“整个文件”,\1\2 是对表达式的\(..\) 部分的反向引用)

或者,更好的是:

:%s@\(<title>.\{-}\)<\(.\{-}</title>\)@\1\2@

\{-}* 的非贪婪版本)。

但是,我假设您要替换 &lt;,因为它是非法的 XML 语法,您可以将其替换为 &amp;amp;,如下所示:

:%s@\(<title>.\{-}\)<\(.\{-}</title>\)@\1\&amp;\2@

【讨论】:

  • 嗨 Kenney,我最后用 g 尝试了多少这个命令全局替换,但它在该行替换了一个
  • 嗨,很抱歉!更新了答案。你会希望:%s 替换整个文件。 /g 表示替换一行中的所有匹配项,而不仅仅是第一个匹配项。
  • E488 尾随字符
  • 那么在你上一个@ 之后可能会有一些东西。只需将答案中的一种模式复制到 vim 的命令行中(并确保行首没有双 :)。
  • 带有 vim 或 sed 的正则表达式有些不标准;我通常为此使用 perl:cat yourfile | perl -ne 's@(&lt;title&gt;.*?)&lt;(.*?&lt;/title&gt;)@\1&amp;amp;\2@; print' &gt; newfile.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 2020-12-22
相关资源
最近更新 更多