このように動くスクリプト
$ echo "##TODAY##" | sed s/##TODAY##/"`date +%Y年%m月%d日`"/g
2025年12月23日
これを、 2025/12/23 のように出力したい。
利用シーン
これはシェルスクリプトの一部。
元々はこのような行で使っていて、
original_xmllint.xml $2 | sed s/##TODAY##/"`date +%Y年%-m月%-d日`"/g > content.xml
xml 中でのキーワードを本日の日付に差し替える。xml は 表計算のドキュメントをほどいたものであって、処理後に pdf 化を行うための一環。
cf.,https://qiita.com/nanbuwks/items/9cddc154f2d21c891ca5
dateコマンド
date コマンドの出力は
$ date +%Y/%m/%d
2025/12/23
$ date +%Y/%m/%d
2025/12/23
これだけだと問題ないのだけれど・・・
sed
単に以下のようにすると、スラッシュが sed の正規表現のデリミタと競合しておかしくなってしまう。
$ echo "##TODAY##" | sed s/##TODAY##/"`date +%Y/%m/%d`"/g
sed: -e expression #1, char 20: `s' に対するオプションが不明です
解決
1.スラッシュを使わないようにして解決
以下のようにして、デリミタを / から別の文字に変更する。以下は @ にした例。
$ echo "##TODAY##" | sed s@##TODAY##@`date +%Y/%m/%d `@g
2.エスケープによる解決
echo "##TODAY##" | sed s/##TODAY##/"`date +%Y\\\/%m\\\/%-d\ `"/g
2025/12/23
ちなみに、\ が1つや2つだと sed コマンドにエスケープが渡らないのでうまくいかない。
$ echo "##TODAY##" | sed s/##TODAY##/"`date +%Y\/%m\/%d`"/g
sed: -e expression #1, char 20: `s' に対するオプションが不明です
$ echo "##TODAY##" | sed s/##TODAY##/"`date +%Y\\/%m\\/%d`"/g
sed: -e expression #1, char 20: `s' に対するオプションが不明です
また、シングルクォーテーションを使った場合はバッククォートによるコマンド実行がなされないので良くない。
$ echo "##TODAY##" | sed s/##TODAY##/'`date +%Y\\\/%m\\\/%d`'/g
`date +%Y\/%m\/%d`