はじめに
bashでは「%」や「#」を用いた変数のパターンマッチを行うことで特定キーワードの前半/後半を切り出すことができます。
これによって一連のパスの中からファイル名の特定箇所を抽出することができるので、実際の利用例と共にワンライナーを紹介します。
環境情報
$ bash --version GNU bash, version 4.2.46...
シャープとパーセントで利用できる
紹介するのは以下の2種類。
${変数#パターン}
${変数%パターン}
具体的には[ファイル名][数字].[拡張子]のようなファイルを一気に処理したい場合に使います。
以下のような4つのファイルを用意しました。
$ ls
file1.txt file2.txt file3.txt file4.txt
for構文を利用することで、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を除いた文字列が表示されています。
これを応用すればfile[数字].txt ではなく text[数字].txt のようなファイル名の置換に使えます。
$ for x in file*; do mv $x text${x#file}; done ⏎ $ ls ⏎ text1.txt text2.txt text3.txt text4.txt
変数%パターン
こちらは「パターン部分を除いたファイル名の前半を取り出したい時」に使います。
正確に書けば、"変数の内容について、最後の部分とパターンがマッチした場合に、もっとも短く一致する部分を取り除いた残りの部分を返す" 役割が ${変数%パターン} にはあります。
先程の続きから実行した例ですが
$ for x in text*; do echo ${x%.txt}; done ⏎ text1 text2 text3 text4
拡張子がない状態で文字列が出力されています。
これを応用することで、拡張子を一気に変更する際に使えます。
終わりに
Bashの世界では「##」や「%%」などもありますが、まずはこの二つのパターンマッチがよく利用されるので覚えておくと役立つと思います。
以上、ご参考になれば幸いです。