我正在尝试从demo.cfg
文件修改配置文件.sh
。我可以使用sed
修改它,但问题是当值包含斜杠字符时。
为此,我使用此代码:
read -r -p "(Default PATH: /my/default/path/): " response
case $response in
(*[![:blank:]]*) sed -i '/key_one/s/= ''.*/= '$response'/' demo.cfg; echo 'OK';;
(*) echo 'Using default path'
esac
变量$response
有斜杠的错误:
sed: -e expression #1, char 20: unknown option to "s"
我可以将此变量用于sed函数吗?
此处demo.cfg
文件
[params]
key_one = 1
key_two = 9
先谢谢了 最好的问候
答案 0 :(得分:1)
尝试像这样传递response
${response//\//\\/}
这会将所有/
替换为\/
。例如:
$ response=/my/path/to/target
$ echo ${response//\//\\/}
\/my\/path\/to\/target
您的个案陈述也存在问题。您的bash脚本应如下所示:
#!/bin/bash
read -r -p "(Default PATH: /my/default/path/): " response
case $response in
*[![:blank:]]*) sed -i "/key_one/s/= .*/= ${response//\//\\/}/" demo.cfg
echo 'OK'
;;
*) echo 'Using default path'
;;
esac
答案 1 :(得分:0)
您有两种选择:
使用其他分隔符替换,例如#
或_
:
sed 's#/foo/bar/#/spam/egg#' file.txt
为了清晰起见,这里使用了模式中没有的东西。
或者逃避实际的/
:
sed 's/\/foo\/bar\//\/spam\/egg/' file.txt
这不是很清晰,因此不推荐使用。
答案 2 :(得分:0)
要转义您选择的分隔符,请使用参数展开:
$ response=/foo/bar
$ response=${response//\//\\\/}
$ echo "$response"