【问题标题】: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;

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

【问题讨论】:

    标签: regex sed replace


    【解决方案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,它运行良好,感谢您让我走上正确的道路 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-29
      • 2021-03-11
      • 2021-03-20
      • 2014-06-22
      • 2017-07-13
      • 2013-02-11
      相关资源
      最近更新 更多