【问题标题】:How to translate sed "s" command from double to single quotes如何将 sed "s" 命令从双引号翻译成单引号
【发布时间】:2021-12-20 10:40:48
【问题描述】:

我的问题是我有这个命令:

sed -i -E 's/((^|\s)PATH=)([^\$]*)$/\1${PATH:-\3}/g' /foo

就我使用单引号而言,它工作正常,但现在我需要使用双引号(因为 Dockerfile 不喜欢单引号),当我尝试将其翻译为:

"s/((^|\s)PATH=)([^\$]*)$/\1${PATH:-\3}/g"

我收到此错误:unknown option to `s'。所以我读到我可以尝试替换分隔符并尝试使用@

"s@((^|\s)PATH=)([^\$]*)$@\1${PATH:-\3}@g"

但是我得到:unterminated `s' command。我也尝试用;替换:

"s;((^|\s)PATH=)([^\$]*)$;\1${PATH:-\3};g"

并且“成功”了,但最终结果与我的预期不同。关于如何正确翻译以将其与双引号一起使用的任何想法?

【问题讨论】:

  • 转义所有美元符号和反斜杠。

标签: sed dockerfile


【解决方案1】:

不要!您可以轻松地将其转换为带有反斜杠且不带引号的字符串:

$ printf "%q\n" 's/((^|\s)PATH=)([^\$]*)$/\1${PATH:-\3}/g'
s/\(\(\^\|\\s\)PATH=\)\(\[\^\\\$\]\*\)\$/\\1\$\{PATH:-\\3\}/g

$ sed -E s/\(\(\^\|\\s\)PATH=\)\(\[\^\\\$\]\*\)\$/\\1\$\{PATH:-\\3\}/g

【讨论】:

    【解决方案2】:

    正如@glenn jackman 所提到的,转义反斜杠和美元符号确实有效,这对我有用:

    "s/((^|\\s)PATH=)([^\\\$]*)\$/\\1\${PATH:-\\3}/g"
    

    谢谢!

    【讨论】:

    • 这一步是必须的,因为 q 双引号字符串会受到 shell 变量扩展的影响。单引号字符串不是。
    猜你喜欢
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    相关资源
    最近更新 更多