在特定的XML标签中将小写更改为大写

时间:2018-08-05 12:54:24

标签: bash sed

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

我找到了许多更改特定标签的方法,但是由于我有两个名称相同的标签,并且只想更改内部服务器标签,因此我无法使用sed进行更改。 / p>

xml示例:

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

我尝试没有成功:

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

1 个答案:

答案 0 :(得分:1)

只要不将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是一个gnu sed扩展,将\1占位符的内容转换为大写形式

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