😀

sedでできる設定ファイル書き換えメモ

2022/11/28に公開

よくフレームワークとかでDBの設定項目とか使ってる環境に変更することがある時にワザワザ手動で書き換える面倒なのでshellで自動置換できるようにした時のメモ

php編

配列の場合

例にこんな設定項目があったとする

sample.php
array(
	'connection'  => array(
		'hostname' => 'localhost',
		'port' => '3306',
		'database' => 'hoge',
		'username'   => 'username',
		'password' => 'password',
	),
),

hostnameを書き換えたい場合はこんな感じでできる

sed -i -e "s/'hostname' => \('.*'\)/'hostname' => 'hoge'/g" test.php 

localhostがhogeに変更できる

同様にport,database,username,passwordも変更してみよう(sedなら-eの連続で渡せる)

sed -i -e "s/'hostname' => \('.*'\)/'hostname' => 'hoge'/g" -e "s/'port' => \('.*'\)/'port' => '3312'/g" -e "s/'database' => \('.*'\)/'database' => 'myproject'/g" -e "s/'username' => \('.*'\)/'username' => 'myuser'/g" -e "s/'password' => \('.*'\)/'passward' => 'mypass'/g" sample.php 

書き換えたファイル

sample.php
array(
	'connection'  => array(
		'hostname' => 'hoge',
		'port' => '3312',
		'database' => 'myproject',
		'username'   => 'username',
		'passward' => 'mypass',
		'presistent' => false
	),
),

ダブルコーテションの場合もちょっと書き換えるだけでいける

sample.php
		"connection"  => array(
			"hostname" => "localhost"
			"port" => "3307",
		),
sed -i -e 's/"hostname" => \(".*"\)/"hostname" => "hoge"/g' sample.php 

'(シングルコーテション)をダブルコーテションに書き換えるだけ
※-eのオプションは逆にシングルコーテーションで囲む

sample.php
		"connection"  => array(
			"hostname" => "fuga"
			"port" => "3307",
		),

ini編

これはシンプルにいける

sampleini.ini
;sample code
[db]
hostname = localhost
port = 3306
database = hgoe
username = username
password = password
sed -i -e "s/hostname = \(.*\)/hostname = fuga/g"  sampleini.php 
sampleini.ini
;sample code
[db]
hostname = fuga
port = 3306
database = hgoe
username = username
password = password

json編

例にこんな設定項目があったとする

sample.json
   "db": {
        "hostname" : "localhost"
        "port": "3307",
        "username": "username",
        "password": "password"
    }

hostnameを書き換えるならこれ

sed -i -e 's/"hostname" : \(.*\)/"hostname" : "fuga"/g' test4.json 
sample.json
   "db": {
        "hostname" : "fuga"
        "port": "3307",
        "username": "username",
        "password": "password"
    }

portやusernameとかも配列の例と同様に-eで繋げればか書き換えられます

応用編 同じ項目が複数ある場合は?

行数の範囲指定をすればいける

sample.json
  1     "db": {
  2         "hostname" : "localhost"
  3         "port": "3307",
  4         "username": "username",
  5         "password": "password"
  6     },
  7     "db2":{
  8         "hostname" : "localhost"
  9         "port": "3307",
 10         "username": "username",
 11         "password": "password"
 12     }
sed -i -e '1,6s/"hostname" : \(.*\)/"hostname" : "fuga"/g' test4.json 
sample.json
  1     "db": {
  2         "hostname" : "fuga"
  3         "port": "3307",
  4         "username": "username",
  5         "password": "password"
  6     },
  7     "db2":{
  8         "hostname" : "localhost"
  9         "port": "3307",
 10         "username": "username",
 11         "password": "password"
 12     }

設定変更shellscriptとか書くときに役に立つとおもいます

Discussion