(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Linux/Bash】変数のパターンマッチにて特定ワードの前後を抜き出す手法

スポンサーリンク

はじめに

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}; done1.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の世界では「##」や「%%」などもありますが、まずはこの二つのパターンマッチがよく利用されるので覚えておくと役立つと思います。
以上、ご参考になれば幸いです。