我有一个.xml
包含以下内容的文件
<controller-host></controller-host>
<controller-port></controller-port>
<tier-name></tier-name>
<node-name></node-name>
我想要这样的输出
<controller-host>AppDynamicsHost</controller-host>
<controller-port>80</controller-port>
<tier-name>**the host name**</tier-name>
<node-name>tomcat server</node-name>
我尝试使用sed
但无法使用。
答案1
给定的文件不是有效的 xml。您必须添加开始和结束根标记。像这样:
<xml>
<controller-host></controller-host>
<controller-port></controller-port>
<tier-name></tier-name>
<node-name></node-name>
</xml>
通过该输入,您可以使用 xml 解析器来xmlstartlet
编辑内容:
xmlstarlet ed -O -u //controller-host -v "AppDynamicsHost" \
-u //controller-port -v "80" \
-u //tier-name -v "the hostname" \
-u //node-name -v "tomcat server" file
ed
启动编辑模式xmlstartlet
-O
省略<?xml version="1.0"?>
声明-u
更新给定的 xpath-v
设置给定值
那么输出将是:
<xml>
<controller-host>AppDynamicsHost</controller-host>
<controller-port>80</controller-port>
<tier-name>the hostname</tier-name>
<node-name>tomcat server</node-name>
</xml>
要直接就地编辑文件,您可以使用该-L
标志。
答案2
你可以尝试这样的事情:
$host='hostname'
sed -i 's/<controller-host><\/controller-host>/<controller-host>AppDynamicsHost<\/controller-host>/' yourfile.xml
sed -i 's/<controller-port><\/controller-port>/<controller-port>80<\/controller-port>' yourfile.xml
sed -i "s/<tier-name><\/tier-name>/<tier-name>${host}<\/tier-name>/' yourfile.xml
sed -i 's/<node-name><\/node-name>/<node-name>tomcat server<\/node-name>/' yourfile.xml
该-i
标志意味着将结果写入您的文件,尝试在不进行-i
同时测试的情况下运行它。
答案3
正如 Chaos 所说,使文件成为有效的 XML 文件并使用xmlstarlet
或类似的 xml 处理工具(例如xsh
)是“正确”的答案...但是如果您只想进行简单的模板化,那么您将修改您的输入文件以轻松找到以及您希望能够更改的位置中的可替换令牌。例如:
<controller-host>__CONTROLLER__</controller-host>
<controller-port>__PORT__</controller-port>
<tier-name>__HOSTNAME__</tier-name>
<node-name>__NODENAME__</node-name>
然后您可以使用任何常用工具(awk、sed、perl、ruby 等)将__CONTROLLER__
etc 替换为您希望它们具有的实际值。
注意:使用文本中不会出现的字符串非常重要 - 这就是为什么我使用__
作为可替换字符串的一部分,例如,__PORT__
而不仅仅是PORT
.
这适用于非常简单的模板需求 - 如果您需要进行更复杂的模板,许多语言都有非常复杂的模板库 - 例如perl
(Text::Template
以及许多其他 - 这是一个激发了许多解决方案的常见问题)