ちょっと嵌ったので覚書。
環境
OS:Linux Mint 17.1 “Rebecca” KDE
sed:sed (GNU sed) 4.2.2
経緯
自宅にある写真や音楽ファイルの管理には基本的にファイル名にタグを書き込んで管理している。
というのもファイル名そのものに発売日や撮影日、アーティストや撮った場所などを書き込んで、音楽管理ソフトやアルバムソフトなどを使わずともごく一般的なエクスプローラーでも並び替えが可能となるようにしている。
そこでタグの囲い込みに使っているのが半角の角括弧である。
☆一例
- [2010-05-03][ディズニーランド] P1000640.jpg
- [2015-04-15][ポルノグラフィティ] オー!リバル
的な感じで。
スクリプトで一括操作する際もfindかforとsedを用いて色々するのにも都合がいい。
問題のファイル
[2014-11-05][ネット] PS553[ad] nnc.jpg
どうやらネットから落としてきた画像に面倒くさいものが混じっていたらしい。
[ad]←広告の画像という時点でどうかしていると思うが更に半角空白まで混じっている。
しかし、自動化の本質はエラーなくいかなる状態のものでも扱えることが究極なのだから扱えるようにしたい。
タグとファイル名を分けて抽出するsedを組んでいたのだが・・・
for i in *.*; do echo $i | sed -r 's/^\[(.+)\]\[(.+)\] (.+)\.([^.]+)$/\1,\2,\3,\4/' >> export.csv; done
これだと
2014-11-05,ネット] PS553[ad,nnc,jpg
になってしまう。
sedは最短一致させる場合**(.+?)
**が何故か使えない。
sedで最短一致をしたければ一致させたい文字(今なら**]
)を除いて繰り返す事になる1。
(つまり[^{一致させたい文字}]+
**)
ということで、角閉じ括弧をブラケット(**[]
のこと)の中に入れたいのだがどうしたら・・・
角閉じ括弧の繰り返しなら[\]]
**となるのだが・・・
**[^\]]
**←でいいのだろうか?
for i in *.*; do echo $i | sed -r 's/^\[(.+)\]\[([^\]]+)\] (.+)\.([^.]+)$/\1,\2,\3,\4/' >> export.csv; done
## >> [2014-11-05][ネット] PS553[ad] nnc.jpg
どうやら違うようです。
ということは・・・
for i in *.*; do echo $i | sed -r 's/^\[(.+)\]\[([^]]+)\] (.+)\.([^.]+)$/\1,\2,\3,\4/' >> export.csv; done
## >> 2014-11-05,ネット,PS553[ad] nnc,jpg
やはりエスケープしなくていいのね。
解決〜