【问题标题】:sed command not replacing ip address via variables [duplicate]sed 命令不通过变量替换 IP 地址 [重复]
【发布时间】:2018-04-23 09:21:50
【问题描述】:

我的开发环境设置是这样的,它要求我在 /etc/host 文件中具有特定的主机名到 localIP 条目。(原因是多个微服务和存储,即 Cassandra 和 Redis 绑定到主机名) 我创建了这个简单的 bash 脚本

newIP=`ip a | grep wlp5s0 | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" | head -1`
echo $newIP
oldIP=`ping -q -c 1 -t 1 dummy | grep PING | sed -e "s/).*//" | sed -e "s/.*(//"`
echo $oldIP
sed -i 's/$oldIP/$newIP/g' /etc/hosts

虽然这是打印正确的 ip,但没有发生替换 ,在我看来是 sed 的问题,但不确定

【问题讨论】:

    标签: bash shell sed


    【解决方案1】:

    您应该通过以下方式更改您的 sed 命令:

    sed -i "s/$oldIP/$newIP/g" /etc/hosts
    

    如果你使用简单的引号" ' "你的变量不会被它的值替换!

    您还可以通过以下方式编辑您的第一个正则表达式:

    \b(\d{1,3}\.){3}\d{1,3}\b
    

    最后但同样重要的是,您应该在就地模式使用 sed 之前备份您的 /etc/hosts 文件,以避免出现意外情况。

    希望对你有帮助!

    【讨论】:

    • 喜欢使用sed -i.bak "s/$oldIP/$newIP/g" /etc/hosts ??
    • 感谢您的回答,这行得通。您还能说出更改正则表达式的好处吗?
    • 正则表达式更紧凑。对于相同的行为,更少的写作/更少的阅读->提高生产力,并且对您的手指,眼睛更好。 :-) 就性能而言,我不知道使用\d 是否更好,但正则表达式字符串会更小(内存消耗很少)
    • 感谢您的解释
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-02
    • 1970-01-01
    • 2019-02-11
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    相关资源
    最近更新 更多