我有以下名为SetScript
的bash脚本:
#!/bin/bash
# make sure CWD is correct location
if [ ! -f $1 ];
then
echo "No file at \"$1\" found."
exit 0
fi
sed -i -r "s/^([\t ]+SCRIPT = \")[^\"]*\";\ #\*/\1$2\";\ #\*/" $1
此脚本用于更改文本文件中的以下行:
SCRIPT = "default.script"; #*
文本文件只是我在libconfig ++库中使用的配置文本文件。
因此,例如,如果我的配置文本文件名为settings.cfg
,那么我可能会这样做
SetScript settings.cfg another.script
甚至是
SetScript settings.cfg "another.script"
这些命令会导致上面的文本文件行更改为:
SCRIPT = "another.script"; #*
到目前为止一切顺利。但是,当我尝试使用包含正斜杠的UNIX路径替换时,我遇到了sed问题。例如:
$ SetScript settings.cfg "/home/me/some.script"
sed: -e expression #1, char 38: unknown option to `s'
$ SetScript settings.cfg /home/me/some.script
sed: -e expression #1, char 38: unknown option to `s'
我的问题是:如何修改我的bash脚本(同时仍使用sed
)以允许替换任何UNIX系统路径(相对或完整)?
答案 0 :(得分:2)
这是因为您使用的sed
分隔符也是/
,因此sed
命令在看到如此多的斜杠时会感到困惑。
尝试设置其他分隔符,例如_
:
sed -i -r "s_^([\t ]+SCRIPT = \")[^\"]*\";\ #\*_\1$2\";\ #\*_" $1
^ ^ ^
$ echo "he/llo" | sed 's/he/bye/'
byello
$ echo "he/llo" | sed 's/he/llo/bye/'
sed: -e expression #1, char 10: unknown option to `s'
$ echo "he/llo" | sed 's_he/llo_bye_'
bye