0

我有一个配置文件作为 hive-site.xml

一个配置元素是;

  <property>
    <name>hadoop.embedded.local.mode</name>
    <value>true</value>
  </property>

我想通过 shell 脚本将“true”更改为“false”。但是在文件中有很多配置元素,例如;

   <value>true</value> 

标签。

因此,据我所知,我用来查找和替换字符串的“sed”命令在这里很难使用。感谢是否有人可以帮助我。

4

4 回答 4

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
于 2013-04-18T05:15:02.937 回答
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>,然后选择该值元素。然后,您可以根据自己的喜好修改元素的内容并再次打印为字符串。XPath 是标准的,所以大致相同的代码也应该在其他实现中工作。

于 2013-04-18T05:08:13.000 回答
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
于 2013-04-18T04:48:45.743 回答
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 
于 2013-10-28T16:38:15.440 回答