当我尝试执行以下命令时(我想重写sql)。
Day='2020/12/1'
Dir=/home/test/data
sql=`cat $Dir"/"$test".sql" | sed -e "s/Day/$Day/g"`
我遇到了以下错误。
sed: -e expression #1, char 24: unknown option to `s'
为什么s
被认为是选项?为什么这个命令不能很好地工作?
如果有人有意见,请告诉我
谢谢
答案1
如果用作命令/
的分隔符s/pattern/replacement/flags
sed
,则需要/
在模式和替换中转义。最好使用模式或替换中不出现的分隔符:
Day='2020/12/1'
Dir=/home/test/data
sql=$(sed "s|Day|$Day|g" < "$Dir/$test.sql")
既然你正在标记zsh
,你也可以这样做:
sql=${"$(<$Dir/$test.sql)"//Day/$Day}
然后,您不必担心此类问题,也不必担心字节在语言环境中无法形成有效字符。
对于多次替换:
typeset -A replace=(
Day "$Day"
Month "$Month"
Year "$Year"
'*' Star
)
pattern="(${(j[|])${(kb@)replace}})"
set -o extendedglob
sql=${"$(<$Dir/$test.sql)"//(#m)$~pattern/$replace[$MATCH]}