如何用 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
【讨论】:
转义分隔符是一个好的开始。但是,可能有更多的符号需要转义,例如&
和\
(尤其是尾随时)。【参考方案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 的变量替换单引号字符串? [复制]的主要内容,如果未能解决你的问题,请参考以下文章