【问题标题】:sed command to find and replace string with special characters to a string in command linesed 命令在命令行中查找并替换带有特殊字符的字符串
【发布时间】:2020-08-26 09:40:42
【问题描述】:

我正在尝试使用 sed 在 .property 文件中查找/替换带有特殊字符的字符串。

这是我在文件中的原始行:

kylin.source.hive.beeline-params=-n root --hiveconf hive.security.authorization.sqlstd.confwhitelist.append='mapreduce.job.*|dfs.*' -u jdbc:hive2://localhost:xxxx

我需要更换:

root --hiveconf hive.security.authorization.sqlstd.confwhitelist.append='mapreduce.job.*|dfs.*'

hadoop

和其他字符串:

localhost

ip-00-00-00-000.ec2.internal

最终输出需要如下所示:

kylin.source.hive.beeline-params=-n hadoop -u jdbc:hive2://ip-00-00-00-000.ec2.internal:xxxx

我使用 sed 尝试了几种不同的格式:

sudo sed -i 's/root --hiveconf hive\.security\.authorization\.sqlstd\.confwhitelist\.append=\'mapreduce\.job\.\*\|dfs\.\*\'/hadoop' /usr/local/kylin/kylin.properties
sudo sed -i 's/root \-\-hiveconf hive\.security\.authorization\.sqlstd\.confwhitelist\.append\=\'mapreduce\.job\.\*\|dfs\.\*\'/hadoop' /usr/local/kylin/kylin.properties
sudo sed -r 's/root \-\-hiveconf hive\.security\.authorization\.sqlstd\.confwhitelist\.append\=\'mapreduce\.job\.\*\|dfs\.\*\'/hadoop' /usr/local/kylin/kylin.properties

当我执行上述命令时,我没有得到任何输出,它正在等待另一个输入。有人可以帮我解决这个问题吗?

【问题讨论】:

  • 我看到的一个问题是你逃避太多(不是太少,你似乎担心)。除了字符类之外,连字符不是元字符。在基本的正则表达式(这是 sed 使用的,除非你使用 -E-r 标志)不支持交替,所以管道字符应该 not 被转义。您不能只是随机尝试并希望获得好运;您需要选择一个文档源并查阅它以确切了解哪些需要转义,哪些不需要转义。

标签: shell sed kylin


【解决方案1】:

这里:

sed -i "s#root.*dfs.*'#hadoop#g; s#localhost#ip-00-00-00-000.ec2.internal#g" /usr/local/kylin/kylin.properties

将输出:

kylin.source.hive.beeline-params=-n hadoop -u jdbc:hive2://ip-00-00-00-000.ec2.internal:xxxx

或仅替换文件中的第一个匹配项:

sed -i "0,/root.*dfs/{s#root.*dfs.*'#hadoop#g; s#localhost#ip-00-00-00-000.ec2.internal#g}" /usr/local/kylin/kylin.properties

【讨论】:

  • 谢谢,我已尝试使用该命令,我需要 sed 命令仅替换文件中的第一个匹配项。我尝试省略 g 标志,但这仅有助于每行中搜索字符串的第一个实例将被替换,但不是整个文件的唯一第一次出现。我以前很少使用 sed 搜索和替换。你能告诉我我该怎么做吗?
【解决方案2】:

当您想用文字字符串替换文字字符串时,请使用像 awk 这样可以理解文字字符串的工具,而不是像 sed 这样只能理解正则表达式和启用反向引用的替换的工具,然后您需要小心地转义元字符和不同方式的分隔符(参见is-it-possible-to-escape-regex-metacharacters-reliably-with-sed:

$ cat tst.awk
BEGIN {
    map["root --hiveconf hive.security.authorization.sqlstd.confwhitelist.append='mapreduce.job.*|dfs.*'"] = "hadoop"
    map["localhost"] = "ip-00-00-00-000.ec2.internal"
}
{
    for (str in map) {
        if ( s = index($0,str) ) {
            $0 = substr($0,1,s-1) map[str] substr($0,s+length(str))
        }
    }
    print
}

$ awk -f tst.awk file
kylin.source.hive.beeline-params=-n hadoop -u jdbc:hive2://ip-00-00-00-000.ec2.internal:xxxx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 2018-08-20
    • 1970-01-01
    相关资源
    最近更新 更多