bash - 在某个 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
解决方案
只要 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 工具。
推荐阅读
- python - 如何在不换行的情况下编写 \n
- node.js - 当响应太大时,为什么在 AppEngine 上运行的 NodeJS API 会出现 500 错误?
- android - 如何将 CPCL 集成到 Android Java?
- html - 如何仅将滚动条添加到 tbody 而不是固定 thead
- android - 第三方无障碍服务能否在 Android 10 上捕获音频?
- django - 如何测试用户是否是组列表中的组之一
- python - 在数据框的不同轴中绘制多个图表
- javascript - 考虑到标签碰撞间隔和块级元素,如何创建一个简单的标记/荧光笔?
- python - 如何在python中按顺序附加两个列表?
- azure - Azure 媒体服务 CreateWithHttpMessagesAsync - 操作返回无效状态代码:“BadRequest” -