Ryusuke Fuda's Tech Blog

Softweare Enginier about Web, iOS, Android.

複数ファイルの中身に文字列を追加する方法(sh)

自分がいる階層の2個下の階層の同じ名前のファイルconfig.phpの中の$id = array の次の行にスペース4つに続いて
'site001' ⇒ 'aaaa'
その次の行にスペース4つに続いて
'site002' ⇒ 'bbbb'
を追加したい場合
(自分がいる階層に名前は違うが形式が同じファイルが大量にある)

①てきとうなファイルを作る。

vi filter.pl

②そこにperlで処理を書いていく

#!/usr/bin/perl -i

while (<>) {
  s#(^\s*\$id\s*=\s*array.*)#$1\n    'site001' => 'aaaa'\n    'site002' => 'bbbb',#;
  print;
}

そもそも置換の処理は

s/置換前の文字/置換後の文字/;

この処理の中で/を使いたいので適当な文字列(今回は#)を使う。わざわざ/の前に\を入れたくないので。

正規表現
^\s* スペースを0回以上で始まる
\$id\s*=\s*array $idスペース0回以上=スペース0回以上array
.* なんでもいい文字0回以上
() 全体を小かっこで囲むと正規表現で見つかったそれを$1と書いて呼び出せる
※今回置換ではなく追加なので$id = arrayも置換後に入れる。しかし、また書くのは面倒。つまり$1は$id = arrayとなる二回目の()は$2

③このfilter.pl をfindと一緒に実行する

find ./*/data/config.php -type f -exec ~/work/filter.pl {} \;

find ./*/data/config.php 今いるところのファイルすべての中のdataの中のconfig.phpから探す
~/work/filter.pl ホームのworkディレクトリの中のfilter.plを実行※workは勝手に作ったディレクトリ