次のコマンドを実行しようとしたとき(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]}