仅当字符串包含匹配项时才替换字符串周围的标签

Posted

技术标签:

【中文标题】仅当字符串包含匹配项时才替换字符串周围的标签【英文标题】:Replace tags surrounding string only if string contains match 【发布时间】:2021-10-31 06:10:30 【问题描述】:

我有一个包含许多行的文件,其中包含被标签包围的字符串。

  <tag:identifier>99454</tag:identifier>
  <tag:identifier>97817(web)</tag:identifier>
  <tag:identifier>http://www.google.com</tag:identifier>
  <tag:title>Title String/</tag:title>
  <tag:creator>Example</tag:creator>
  <tag:creator>Field</tag:creator>
  <tag:creator>Country</tag:creator>

我正在尝试找到一种方法来更改每个 URL 周围的标签。它们都以&lt;tag:identifier&gt;http 开头,因此查找哪些行包含 URL 不是问题,我只是不知道如何替换结束标记。比如给&lt;tag:url&gt;http://www.google.com&lt;/tag:url&gt;

我可以使用什么工具来做到这一点?

【问题讨论】:

【参考方案1】:

如果您可能有一个像 http://www.identifier.com 这样的网址,您可以匹配该行的每个部分。

sed -r 's#<(tag:identifier)>(.*)</\1>#<tag:url>\2</tag:url>#' file

【讨论】:

【参考方案2】:

你可以试试这个sed

sed -E '/http/ s/identifier/url/g' $file

这将匹配任何带有http 的行,然后将identifier 替换为url

你也可以使用这个awk

awk -F"[<>]" '$3~/http/$2="<tag:url>"; $4="</tag:url>"1' $file

这里,我们将分隔符设置为&lt;&gt;,并替换第2列和第4列的值

输出

  <tag:identifier>99454</tag:identifier>
  <tag:identifier>97817(web)</tag:identifier>
  <tag:url>http://www.google.com</tag:url>
  <tag:title>Title String/</tag:title>
  <tag:creator>Example</tag:creator>
  <tag:creator>Field</tag:creator>
  <tag:creator>Country</tag:creator>

【讨论】:

谢谢,我在 macOS 上使用 sed -E '/http/ s/:identifier/:idurl/g' file.xml &gt; newfile.xml,它运行良好,感谢您让我走上正确的道路 :)

以上是关于仅当字符串包含匹配项时才替换字符串周围的标签的主要内容,如果未能解决你的问题,请参考以下文章

仅当 git 标签不以字符串“Release”或“Test”开头时才在 Gitlab CI 中启动管道

仅当 QProcess Stdout 包含子字符串时才打印它

Python正则表达式:仅当模式重复n次时才匹配

添加 www 的 htaccess 条件。仅当它在 url 中不包含字符串时才到 url

正则表达式 (C#):匹配 > < 或(非法 XML 字符)但仅当包含在引号内时

如何多次替换两个分隔符/字符串之间的唯一字符串