首页 > 解决方案 > 在某个 XML 标记中将小写更改为大写

问题描述

我正在尝试编写一个 bash 脚本,它将服务器内部名称更改为大写。

我找到了很多方法来更改某个标签,但是由于我有两个同名标签,并且我只想更改内部服务器标签,所以我没有设法用sed.

xml 示例:

<server-list>
  <name>joe</name>
  <server.inner>
    <name>jake</name>
  </server.inner>
</server-list>

我试过没有成功:

sed 's/<server.inner><name>.*/\U&/' <fileToSed 

标签: bashsed

解决方案


只要 server.inner 没有相互分组并且 xml 文件相当简单,这样的 sed 脚本就可以工作:

脚本.sed

/<server.inner>/,/<\/server.inner>/ {
   s:<name>(.*)</name>:<name>\U\1\E</name>:gi;
}

你会像这样运行它sed -rf script.sed your.xml

解释

  • /<server.inner>/,/<\/server.inner>/仅匹配server.inner标记的行并将 sed 语句应用于这些行
  • s:<name>(.*)</name>:<name>\U\1\E</name>:gi;是否替换,由于/发生在结束标签中,我们使用s:..:..:而不是s:..:..:
  • (.*) captures the string inside the name tag into the placeholder\ 1`
  • \U\1\E是将\1占位符的内容转换为大写的 gnu sed 扩展

对于复杂的 xml,请遵循 Cyrus 的建议并使用特殊的 xml 工具。


推荐阅读