我有一个配置文件为hive-site.xml
一个配置元素是;
<property>
<name>hadoop.embedded.local.mode</name>
<value>true</value>
</property>
我想通过shell脚本将“true”更改为“false”。 但是在文件中有很多配置元素,例如;
<value>true</value>
标记。
因此我用来查找和替换字符串的“sed”命令很难在我的知识中使用。感谢是否有人可以帮助我。
答案 0 :(得分:1)
这可能是XPath和合理的XML库的一项工作。直接从shell脚本执行此操作将创建一个复杂且可能非常脆弱的解决方案。我将使用python
和流行的lxml
库作为示例:
from lxml import etree
tree = etree.fromstring('''
<property>
<name>hadoop.embedded.local.mode</name>
<value>true</value>
</property>
''')
e = tree.xpath('//property[name="hadoop.embedded.local.mode"]/value')[0]
e.text = 'false'
print etree.tostring(tree)
基本上,如果它包含具有该值的<name>
元素,则选择任何属性节点(doc中的任何位置),然后选择value元素。然后,您可以根据自己的喜好修改元素的内容,并再次打印为字符串。 XPath是标准的,因此大致相同的代码也应该在其他实现中工作。
答案 1 :(得分:1)
显然有很多方法可以做到这一点,但为什么不试试awk(gawk)?
#!/bin/bash
gawk \
'
BEGIN {
FLAG = 0;
}
/hadoop.embedded.local.mode/ {
FLAG = 1;
}
/>[ ]*true[ ]*</ {
if (FLAG == 1) {
FLAG = 0
gsub("true", "false")
}
}
{
print
}
' "$@"
以上述方式调用上述脚本:
<script> hive-site.xml
答案 2 :(得分:0)
你可以给出整个块并进行更改。
sed -i '/s/<property><name>hadoop.embedded.local.mode<\/name><value>true<\/value<\/property>
/<property><name>hadoop.embedded.local.mode<\/name><value>false<\/value><\/property>/'
hive-site.xml
答案 3 :(得分:0)
如果要更改的值始终位于下一行,则可以先使用
获取所需元素的行号NUMBER=$(grep -n "<desired element>" filename | awk -F: '{print $1}')
然后增加到下一行
let NUMBER="NUMBER + 1"
然后使用sed或ex来修改值,在这些情况下我更喜欢ex,因为它不需要临时文本文件。
{
print "${NUMBER}s/true/false/"
print "wq"
} | ex filename