ファイル内の複数箇所を生成したUUIDでワンライナー置換する

IT

これは、あるファイル内にある数十箇所の特定の文字列を、それぞれ新しく生成したUUIDで置換する作業をワンライナーで行う方法の紹介である。

※ Universally Unique Identifierとは、ソフトウェア上でオブジェクトを一意に識別するための128ビットの識別子であり、16進法による 9750940F-0A88-41D4-B481-576079B96544 というような文字列表現が使われることが多い。(Wikipedia)

スポンサーリンク

UUID生成方法

macOSのターミナルを起動し、uuidgenというコマンドを使って生成する。

$ uuidgen
9750940F-0A88-41D4-B481-576079B96544

これを小文字にしたい場合は、trコマンドにパイプで渡して処理すれば良い。

$ uuidgen | tr '[:upper:]' '[:lower:]'
773f4a6a-f19e-4e0d-bda2-f041799a2fb5

編集対象のファイル例

今回の記事では、以下のようなYAMLファイル内の “fuga” というバリューを、それぞれ新しく生成したUUIDで置換する作業を行うものとする。

$ cat hoge.yaml
id1: fuga
id2: fuga
id3: fuga
id4: fuga

置換には前回の記事と同様にperlのワンライナーコマンドを利用するが、一行ずつ読み込む -p オプションのみを使用すると、それぞれを別々のUUIDに置換するのは難しい。

perlのワンライナーで全体を読み込む

しかし、perlコマンドには -0 オプションがあり、これを使うと1行ずつではなく、全行を読み込んだ上で置換処理をすることができる。

たとえば、上記ファイル内の “fuga” をすべて “hoge” に置換するには、以下のコマンドを使う。

$ perl -0pi -e "s/fuga/hoge/g" hoge.yaml

UUID生成と置換を繰り返す

もし、発生させた小文字のUUIDで、ファイル内の “fuga” を1回だけ置換するのであれば、以下のようなコマンドで実行が可能だ。

$ uuidgen | tr '[:upper:]' '[:lower:]' | xargs -I {} perl -0pi -e "s/fuga/{}/" hoge.yaml

ここで xargs は標準入力を読み込み、それを引数として指定したコマンドを実行するコマンドであり、-I オプションにより受け取った入力を後続のコマンドの任意の場所に挿入することができる。

fugaを4件ともすべて置換するには、zshのfor文と組み合わせれば良い。

$ for a in {1..4}; do uuidgen | tr '[:upper:]' '[:lower:]' | xargs -I {} perl -0pi -e "s/fuga/{}/" hoge.yaml; done

結果

実行結果は、以下のようになる。

$ cat hoge.yaml
id1: 3eb9c178-9086-44aa-9376-d815477bd531
id2: 433be77b-ed0f-46df-8a36-acceac08c27a
id3: b49d04cb-b589-4a25-a8c4-0ff27513bfb9
id4: e63ce8a5-14d1-44c2-b867-6e176db2671b

コメント

タイトルとURLをコピーしました