sedとは
sedはテキストファイルの文字列を置換したい場合によく使われるコマンドです。
確実性や再利用性を考えると、テキストファイルの一部を書き換えたい場合は、
vimで編集するよりも sed
コマンドを実行した方がいい場合もあります。
iniファイルのコメントアウト
例えば以下のようなiniファイルがあるとします。
$ cat conf.ini
servers[]="192.168.56.102"
servers[]="192.168.56.103"
servers[]="192.168.56.104"
192.168.56.102
のサーバーをメンテナンスしたいのでコメントアウトしたい場合、
sed
を使って以下のように実行できます。
iniファイルは先頭に;(セミコロン)を付けることでコメントアウト出来ます。
$ sed -i 's/.*192.168.56.102/;&/g' conf.ini
-i
のオプションと最後のファイル名を指定することで、ファイルをそのまま書き換える事が出来ます。
s/
から始まる部分は正規表現を使って記述することが可能です。/までが置換前文字列、
次の/までが置換後文字列になります。
&
は正規表現にマッチした文字列を表しますので、;&
と書くことで内容を変更せず、コメントアウトだけが可能です。
この場合&には、servers[]="192.168.56.102
が入ることになります。
iniファイルのアンコメント
アンコメントをする場合は以下のコマンドです。
先ほどの置換前文字列を ()
で囲んでグルーピングします。
()はそれぞれバックスラッシュでエスケープする必要があります。
()にマッチした文字列は、\1
で表現可能です。
なお、複数の括弧がある場合は、\2,\3・・・のように表現が可能です。
$ sed -i 's/;\(.*192.168.56.102\)/\1/g' conf.ini
sedの基本正規表現と拡張正規表現
sedには 基本正規表現
と 拡張正規表現
があります。
何もオプションを指定しなければ基本となり、 -r
オプションを付けると拡張となります。
拡張正規表現は書き方が少し変わり、場合によっては基本正規表現よりも簡潔に書くことが出来ます。
アンコメントを拡張正規表現で行うと、以下のようになります。
括弧の前のバックスラッシュによるエスケープが不要となります。
sed -i -r 's/;(.*192.168.56.102)/\1/g' conf.ini