【问题标题】:sed gives error with unterminated substitute in regular expressionsed 在正则表达式中给出未终止替换的错误
【发布时间】:2018-03-28 17:11:14
【问题描述】:

我尝试在文件中替换字符串“x.x.x.x”并将结果输出到另一个文件。它在正则表达式中给了我错误未终止的替换

这里是代码

sed 's/x.x.x.x/'$bigip_management_ip'/g' temp.tt >> variables.tf
sed: 1: "s/x.x.x.x/": unterminated substitute in regular expression

echo $bigip_management_ip

54.83.174.153

shitole$ cat temp.tt

variable "bigip_management_ip" {
  default = "x.x.x.x"
}

【问题讨论】:

    标签: shell awk sed


    【解决方案1】:

    这是针对您的问题的 MCVE:

    bigip_management_ip=" 54.83.174.153"
    sed 's/x.x.x.x/'$bigip_management_ip'/g'
    

    在 macOS 上执行时,您会得到:

    sed: 1: "s/x.x.x.x/": unterminated substitute in regular expression
    

    问题是变量中的前导空格由于缺少引用而导致分词。 ShellCheck 对此发出警告:

    In /Users/myuser/myscript line 2:
        sed 's/x.x.x.x/'$bigip_management_ip'/g'
                        ^-- SC2086: Double quote to prevent globbing and word splitting.
    

    除非确定不能引用,否则应始终引用变量:

    sed "s/x.x.x.x/$bigip_management_ip/g"
    

    【讨论】:

    • 感谢 sed "s/x.x.x.x/$bigip_management_ip/g" temp.tt >> variables.tf 用双引号我仍然看到空格?我怎样才能摆脱它?猫变量.tf variable "bigip_management_ip" { default = " 54.83.174.153" }
    • @SanjayShitole 空格在您的变量中。当您要求将x.x.x.x 替换为变量的内容时,显然包含空格。您应该在分配变量的任何位置修复它,或者使用 "s/x.x.x.x/${bigip_management_ip# }/g" 剥离它
    • 我最终将它提取到一个变量中,然后是sed "$sed_opts"
    【解决方案2】:

    只需像下面这样更改您的命令,它对我有用。

    sed 's|'x.x.x.x'|'"$bigip_management_ip"'|g' temp.tt >> variables.tf
    

    【讨论】:

    • sed 's|'x.x.x.x'|'"$bigip_management_ip"'|g' temp.tt >> variables.tf 成功了variable "bigip_management_ip" { default = " 54.83.174.153" }
    • @SanjayShitole,你想说什么?这里不清楚。
    • 非常感谢...您节省了我的时间真的很感激
    • 不知何故,当我打开文件时,我在 vi 编辑器中看到“54.172.214.31^[[0m”而不是“54.172.214.31”,不知道为什么要添加额外的字符,如果我看不到这些做猫猫变量.tf变量“bigip_management_ip”{默认=“54.172.214.31”}
    • dos2unix 不起作用 dos2unix variables.tf dos2unix:在第 2 行找到二进制符号 0x1B dos2unix:跳过二进制文件 variables.tf
    【解决方案3】:
    sed s/x\\.x\\.x\\.x/\\$bigip_management_ip/g
    

    【讨论】:

    • 你应该解释你的答案,纯代码的答案对新用户不太有用。
    • 您能解释一下为什么您认为这是一个很好的答案吗?点之前的反斜杠有什么区别?你的意思是使用s/x\\.x\\.x\\.x/…/(或者's/x\.x\.x\.x/…/')?为什么在美元符号之前有一个反斜杠(这样做有什么好处)?通常,您最好将 sed 脚本(实际程序)括在引号内 — 单引号,除非您需要变量替换:sed "s/x\\.x\\.x\\.x/$bigip_management_ip/"
    猜你喜欢
    • 2021-04-22
    • 2019-02-01
    • 2018-08-22
    • 2021-12-31
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多