代码之家  ›  专栏  ›  技术社区  ›  Adrian Guerrero

如何将sed的“s”命令从双引号转换为单引号

  •  1
  • Adrian Guerrero  · 技术社区  · 3 年前

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

    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"
    

    这“成功了”,但最终结果与我预期的不同。关于如何正确翻译以使用双引号,有什么想法吗?

    1 回复  |  直到 3 年前
        1
  •  1
  •   KamilCuk    3 年前

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

    $ 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
  •  0
  •   Adrian Guerrero    3 年前

    如所述 @glenn jackman 转义反斜杠和美元符号就可以了,这对我来说很有效:

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

    谢谢