(O+P)ut

アウトプット



(O+P)ut

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

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

スポンサーリンク

便利なパターンマッチ記法

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}; done1.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個を覚えて必要あらば詳しく調べるのが良いかなーと思います。