仅当字符串包含匹配项时才替换字符串周围的标签
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 周围的标签。它们都以<tag:identifier>http
开头,因此查找哪些行包含 URL 不是问题,我只是不知道如何替换结束标记。比如给<tag:url>http://www.google.com</tag:url>
我可以使用什么工具来做到这一点?
【问题讨论】:
【参考方案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
这里,我们将分隔符设置为<
或>
,并替换第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 > newfile.xml
,它运行良好,感谢您让我走上正确的道路 :)以上是关于仅当字符串包含匹配项时才替换字符串周围的标签的主要内容,如果未能解决你的问题,请参考以下文章
仅当 git 标签不以字符串“Release”或“Test”开头时才在 Gitlab CI 中启动管道
仅当 QProcess Stdout 包含子字符串时才打印它
添加 www 的 htaccess 条件。仅当它在 url 中不包含字符串时才到 url