bashのブレース展開

現在、Linuxサーバの保守・運用の作業に携わっていまして、ファイルを修正する際にバックアップファイルの作成、元ファイルとの差分確認など行うことがあります。
その作業の中で、上司から「ブレース展開」という方法を教わったので、備忘録もかねてご紹介します。
「ブレース展開」とは、中括弧(ブレース)で囲んだ中に、カンマ区切りで文字列を列挙すると、列挙した順に展開され、半角スペース区切りのリストにしてくれます。
これを活用すると、文字列の前部や後部に共通する文字列があった場合に省略して1つにまとめて書くことができます。
例えば、こんな感じです。
文字列の前部に共通文字列があった場合、echo 7月{01日,02日,03日}
文字列の後部に共通文字列があった場合、echo {わかめ,月見,たぬき}うどん
この「ブレース展開」を活用して、前述のファイルの修正作業を行ってみます。
作業の流れは以下です
- 元ファイル(原本)の中身を出力
- バックアップファイルの作成(コピー)
- 修正用ファイルの作成(コピー)
- 修正用ファイルの編集
- 修正内容の確認(元ファイルと修正用ファイルの差分)
- ファイル更新と更新内容の確認(バックアップファイルと元ファイル(原本)の差分)
1.元ファイル(原本)の中身を出力
はじめにこのようなファイルがあるとします。
favorite_food.txt:「私は、うどん派です。」
2.バックアップファイルの作成(コピー)
バックアップファイルを作成します。
cp –p 元ファイル バックアップファイル(.bak)
※オプション-p:オリジナルファイルの所有者・グループ・アクセス権・アクセス時刻を保存する。
これをブレース展開でやってみると、(※一旦、.bakファイルは消してます)
cp –p 元ファイル{,.bak}
で実行します。
{,.bak}なので、
左からカンマ区切りで、1つ目の「」(空文字)、2つ目が「.bak」です。
つまり、
cp –p 元ファイル 元ファイル.bak
を実行したことと同じになります。
3.修正用ファイルの作成(コピー)
直接、元のファイルを修正しても良いですが、ここでは、修正用ファイルを作成します。
cp –p 元ファイル 修正用ファイル(.new)
ブレース展開を使ってみます。(※.newファイルは一旦消しています)
cp –p 元ファイル{,.new}
なので、
cp –p 元ファイル 元ファイル.new
を実行したことと同じになります。
4.修正用ファイルの編集
修正用ファイルを編集し、内容を出力します。(編集作業は省略します)
favorite_food.txt.new:「私は、そば派です。」
うどん派からそば派への好みの変化の修正をします。
5.修正内容の確認(元ファイルと修正用ファイルの差分)
diff 元ファイル 修正用ファイル(.new)
元ファイル(上)がうどん派。
修正用ファイル下)がそば派。
またブレース展開を使ってみます。
diff 元ファイル{,.new}
なので、
diff 元ファイル 元ファイル.new
を実行したことと同じになります。
6.ファイル更新と更新内容の確認(バックアップファイルと元ファイル(原本)の差分)
修正用ファイルで元のファイルを上書きし、ファイルを更新します。
cp –p 修正用ファイル(.new) 元のファイル
favorite_food.txt:「私は、そば派です。」
好みが変わっていることが確認できました。
ファイルの内容を差分チェックすると、
修正前のバックアップファイルがうどん派。
修正後の元ファイルがそば派。
これもブレース展開でやると、(※favorite_food.txtは一旦消しています)
ファイルの上書きは、
cp -p 元ファイル{.new,}
なので、
cp -p 元ファイル.new 元ファイル
を実行したことと同じになります。
ファイルの差分チェックは、
diff 元ファイル{.bak,}
なので、
diff 元ファイル.bak 元ファイル
を実行したことと同じになります。
以上が、ブレース展開を使用した一例です。
今回ご紹介したカンマ区切りの文字列列挙のパターン以外だと、2重ドット区切りで数字またはアルファベットを指定すると、指定した数字またはアルファベットの間の連続値に展開されます。
- 2重ドット区切りの数字の展開:{1..5}
- 2重ドット区切りのアルファベットの展開:{a..e}
今後も何か学んだ際は、ご紹介できればと思います。
◆WEB会議/セミナーシステム『Szia』
https://www.ois-yokohama.co.jp/szia/
◆サーバサイドで動作するミドルウェア『ReDois』
https://www.ois-yokohama.co.jp/redois/wp_redois/
◆AIがトレンドトピックをもとに、読まれそうな記事タイトルを自動生成『AI Title Maker』
https://ai-title.com/