【问题标题】:How to Replace Single Quoted String With a Variable with sed? [duplicate]如何用 sed 的变量替换单引号字符串? [复制]
【发布时间】:2021-10-04 06:29:56
【问题描述】:

我正在尝试替换文件中的某些文本,如标题中所述。我尝试了什么:

newdir=/dir/to/my/file
sed -i "s/'MyDir'/${newdir}/g" myconf.conf

上面的命令给出了这个错误:

`s' 的未知选项

【问题讨论】:

    标签: linux bash sed replace


    【解决方案1】:

    解决“我的数据是否包含分隔符”问题的一种方法是使用 shell 变量扩展来转义分隔符:

    sed -i "s|'MyDir'|${newdir//|/\\|}|g" myconf.conf
    

    演示:

    $ newdir="/a/dir/with|a/pipe"
    
    $ sed "s|'MyDir'|${newdir}|g" <<< "this is 'MyDir' here"
    sed: 1: "s|'MyDir'|/a/dir/with|a ...": bad flag in substitute command: 'a'
    
    $ sed "s|'MyDir'|${newdir//|/\\|}|g" <<< "this is 'MyDir' here"
    this is /a/dir/with|a/pipe here
    

    您可以使用默认的斜线分隔符来执行此操作,并使用更多转义符

    sed -i "s/'MyDir'/${newdir//\//\\\/}/g" myconf.conf
    

    【讨论】:

    • 转义分隔符是一个好的开始。但是,可能有更多的符号需要转义,例如&amp;\ (尤其是尾随时)。
    【解决方案2】:

    问题在于$newdir 包含/ 字符,因此您的sed 命令最终看起来像s/'MyDir'//dir/to/my/file/g,这将不起作用——第一个/ 有效地终止了您的sed 表达式,其他都是垃圾。

    幸运的是,sed 让您使用 any 字符作为s 命令的分隔符,因此您可以改为:

    sed -i "s|'MyDir'|${newdir}|g" myconf.conf
    

    【讨论】:

    • 虽然不幸的是,路径可以包含您可能用作分隔符的任何其他字符。您必须始终注意newdir 的内容,因为您没有将参数传递给sed:您正在动态构建sed 脚本。
    猜你喜欢
    • 2021-07-04
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    相关资源
    最近更新 更多