便利なパターンマッチ記法
bashでは「%」や「#」を用いた変数のパターンマッチがありますが、最近使うことが増えてきたのでメモとして書いておきます。
紹介するのは、以下の2種類です。
●${変数#パターン}
●${変数%パターン}
[ファイル名][数字].[拡張子]のようなファイルを一気に処理したい場合に使えたりして便利です。
紹介のために、以下のような4つのファイルを用意しました。
$ ls
file1.txt file2.txt file3.txt file4.txt
4つのファイルをワンライナーでいじろうとすると以下の書き方が使えます。
fileで始まるファイルを変数xに格納して、echoで画面に表示しています。
$ for x in file*; do echo $x; done ⏎ file1.txt file2.txt file3.txt file4.txt
さて、まずは ${変数#パターン} です。
ざっくり言えば "パターン部分を除いたファイル名の後半を取り出したい時" に使います。
正確に書けば、"変数の内容について、最初の部分とパターンがマッチした場合に、もっとも短く一致する部分を取り除いた残りの部分を返す" 役割が ${変数#パターン} にはあります。
以下を見ていただければイメージが掴めるかと思います。
$ for x in file*; do echo ${x#file}; done ⏎ 1.txt 2.txt 3.txt 4.txt
これを応用すれば、file[数字].txt ではなく text[数字].txt としたい時などに使えます。
$ for x in file*; do mv $x text${x#file}; done ⏎ $ ls ⏎ text1.txt text2.txt text3.txt text4.txt
次に、 ${変数%パターン} です。
こちらもざっくり言えば "パターン部分を除いたファイル名の前半を取り出したい時" に使います。
正確に書けば、"変数の内容について、最後の部分とパターンがマッチした場合に、もっとも短く一致する部分を取り除いた残りの部分を返す" 役割が ${変数%パターン} にはあります。
こちらも以下を見てください。※上の実行後に行っているので、ファイル名はtextから始まっています。
$ for x in text*; do echo ${x%.txt}; done ⏎ text1 text2 text3 text4
これを応用すれば、拡張子を一気に変えたい場合なんかに使えそうですね。
他にも、「##」や「%%」などもあるんですが、とりあえずは上の2個を覚えて必要あらば詳しく調べるのが良いかなーと思います。