Shell脚本有助于查找和替换字符串

时间:2013-04-18 04:32:00

标签: linux shell unix

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

一个配置元素是;

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

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

   <value>true</value> 

标记。

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

4 个答案:

答案 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