複数ファイルの中身に文字列を追加する方法(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は勝手に作ったディレクトリ