unix 有关查找和替换字符串的Shell脚本帮助

gkl3eglg  于 2023-02-19  发布在  Unix
关注(0)|答案(5)|浏览(193)

我有一个配置文件hive-site.xml
一个配置元素是;

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

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

<value>true</value>

标签。
因此,以我的知识,我用来查找和替换字符串的"sed"命令很难在这里使用。如果有人能帮助我,我将不胜感激。

sxpgvts3

sxpgvts31#

这可能是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>元素,那么它选择value元素。然后,您可以根据自己的喜好修改元素的内容,并再次打印为字符串。XPath是标准的,因此大致相同的代码应该也可以在其他实现中工作。

tjjdgumg

tjjdgumg2#

显然有很多方法可以做到这一点,但为什么不试试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
6psbrbz9

6psbrbz93#

你可以给予整个街区和零钱。

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
xienkqul

xienkqul4#

如果要更改的值总是在下一行,则可以首先使用以下命令获取所需元素的行号

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
f0brbegy

f0brbegy5#

sed javax.jdo.选项.连接URL
新的瓦尔=“Chandu_jdbc”sudo sed -i“/javax.jdo.选项.连接URL/!b;n;c${新瓦尔}”/tmp/配置单元站点. xml sudo sed -i '/javax.jdo.选项.连接URL/!B;n; c“${新瓦尔}”/tmp/配置单元站点. xml sudo sed -i“/javax.jdo.选项.连接URL/!B;n;c${新瓦尔}”/tmp/配置单元站点. xml sudo sed -i '/javax.jdo.选项.连接URL/!B;n; c“”${新瓦尔}“”“/临时文件/配置单元站点. xml

相关问题