代码之家  ›  专栏  ›  技术社区  ›  Luca S.

sed:替换命令“(”中的错误标志

  •  0
  • Luca S.  · 技术社区  · 6 年前

    我试图用js文件的内容替换占位符${SNIPPET}。但我很难理解我所收到的错误。

    sed  -e "s/\${SNIPPET}/$(cat snippet.js)/" ../../handlebars/templates/bootstrap-template.hbs
    

    错误:替换命令中的错误标志:“%(”

    寻找能够跨平台(OSX/Linux)工作的解决方案

    1 回复  |  直到 6 年前
        1
  •  1
  •   glenn jackman    6 年前

    使用这些测试文件

    $ cat snippet.js
    hello/(world)
    $ cat template.hbs
    foo
    ${SNIPPET}
    bar
    

    我可以(某种程度上)复制您的错误(我使用了GNU sed 4.2.2):

    $ sed "s/\${SNIPPET}/$(cat snippet.js)/" template.hbs
    sed: -e expression #1, char 20: unknown option to `s'
    

    您可以这样做,它将转义斜杠(斜杠是 s/// 命令)

    sed "s/\${SNIPPET}/$(sed 's,/,\\/,g' snippet.js)/" template.hbs
    
    foo
    hello/(world)
    bar
    

    或者,如果代码段占位符像我的占位符一样位于自己的行上,则可以使用其他sed命令:

    sed '/\${SNIPPET}/{
        # read the file into the stream
        r snippet.js
        # delete SNIPPET line
        d
    }' template.hbs
    
    foo公司
    你好/(世界)
    酒吧
    

    还有另一种方法

    j=$(<snippet.js)   # read the file: `$(<...)` is a bash builtin for `$(cat ...)`
    sed "s/\${SNIPPET}/${j//\//\\\/}/" template.hbs