2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[正規表現] ブラケット内の角閉じ括弧

Last updated at Posted at 2015-06-03

ちょっと嵌ったので覚書。

環境

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を組んでいたのだが・・・

NG例
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
(つまり
[^{一致させたい文字}]+**)

ということで、角閉じ括弧をブラケット(**[]のこと)の中に入れたいのだがどうしたら・・・
角閉じ括弧の繰り返しなら
[\]]**となるのだが・・・
**[^\]]**←でいいのだろうか?

NG例2
for i in *.*; do echo $i | sed -r 's/^\[(.+)\]\[([^\]]+)\] (.+)\.([^.]+)$/\1,\2,\3,\4/' >> export.csv; done
## >> [2014-11-05][ネット] PS553[ad] nnc.jpg

どうやら違うようです。
ということは・・・

OK
for i in *.*; do echo $i | sed -r 's/^\[(.+)\]\[([^]]+)\] (.+)\.([^.]+)$/\1,\2,\3,\4/' >> export.csv; done
## >> 2014-11-05,ネット,PS553[ad] nnc,jpg

やはりエスケープしなくていいのね。
解決〜

  1. [正規表現] .*?は最短マッチではない を参照 

2
3
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
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?