2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

sed で スラッシュ付の文字列に置換する

2
Last updated at Posted at 2025-12-23

このように動くスクリプト

$ 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`
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?