如何用 sed 的变量替换单引号字符串? [复制]

Posted

技术标签:

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

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

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

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

`s' 的未知选项

【问题讨论】:

【参考方案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 脚本。

以上是关于如何用 sed 的变量替换单引号字符串? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

linux 特殊符号怎样用sed替换

转载:shell脚本之sed使用----替换变量转义字符

shell中,如何替换双引号中内容为某个变量?

Shell sed 如何替换单引号,回车符,以及分号

sed替换字符串(变量)

如何用单引号替换双引号