好的,这很难解释,所以我将给出一个可重现的例子:
我有一个包含以下行的文本文件test.txt
:
somesetting-parameter /an/old/path
我想将其替换为可以通过获取的路径ls
,例如:
ls /etc/init.d/ssh*
输出/etc/init.d/ssh
(Debian) 或/etc/init.d/sshd
(others)
现在,我想使用来替换它sed
,并使用反引号功能,因此我运行了以下命令:
sed -i "s/\/an\/old\/path/`ls /etc/init.d/ssh* | sed 's/\//\\\//g'`/" test.txt
但它给了我错误
sed: -e expression #1, char 9: unknown option to `s'
当(子)命令ls /etc/init.d/ssh* | sed 's/\//\\\//g'
给出适当的输出时
\/etc\/init.d\/ssh
管道用于外部命令正确解析斜杠。
笔记:
我知道只需使用一个变量就可以在 shell 脚本中轻松完成这个操作,但我问这个问题是为了知道哪里出了问题,而不是为了寻找替代方法。
答案1
问题是双引号数据仍将被 shell 处理,在到达 sed 之前删除反斜杠...
尝试使用单引号,或者在双引号内使用两个反斜杠。