如何正确设置sed命令

如何正确设置sed命令

当我尝试执行以下命令时(我想重写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]}

相关内容