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]}

関連情報