UNIX系のOSでは、設定ファイル(「/etc」以下の.confファイル等)を編集する事が多い。 この編集、何らかの方法で自動化出来ないかと調べたところ、sedコマンドを用いる事で実現が可能のようだ。 シェルスクリプト化も容易なので、その際に使えそうな構文を記述していく。

今回は、例として以下のようなファイルに対して処理を行う。

[root@test-centos ~]# cat /home/test.conf
line1=enable
line2=disable
line3=enable
line4=enable
line5=disable
line6=enable
line7=disable

なお、前提として把握してもらいたいのがsedコマンドはオプションで「-i」を用いるか、リダイレクトを使用して保存する(後述)。 そのため、この記事上でもそれらの処理が書かれていない場合は保存されていない(していない)。

そもそもsedコマンドって?

sedコマンドは、UNIX系のOSにバンドルされているファイル編集コマンドだ。 行の挿入、削除、特定行での置換や、ある単語から始まる行でのみ置換を行うなどといった、非常に柔軟性のある操作が可能だ。

行の挿入

4行目に挿入するなど、挿入する行が決まっている場合は、以下のように実行する。

[root@test-centos ~]# sed -e "4i test-line4=disable" /home/test.conf
line1=enable
line2=disable
line3=enable
test-line4=disable
line4=enable
line5=disable
line6=enable
line7=disable

4行目の後に挿入する場合は、以下のように実行する。

[root@test-centos ~]# sed -e "4a test-line4=disable" /home/test.conf
line1=enable
line2=disable
line3=enable
line4=enable
test-line4=disable
line5=disable
line6=enable
line7=disable

1~4行目の各行の前に挿入する場合は、以下のように実行する。

[root@test-centos ~]# sed -e "1,4i test-line4=disable" /home/test.conf
test-line4=disable
line1=enable
test-line4=disable
line2=disable
test-line4=disable
line3=enable
test-line4=disable
line4=enable
line5=disable
line6=enable
line7=disable

1~4行目の各行の後に挿入する場合は、以下のように実行する。

[root@test-centos ~]# sed -e "1,4a test-line4=disable" /home/test.conf
line1=enable
test-line4=disable
line2=disable
test-line4=disable
line3=enable
test-line4=disable
line4=enable
test-line4=disable
line5=disable
line6=enable
line7=disable

「line4」から始まる行の前に挿入する場合は、以下のように実行する。

[root@test-centos ~]# sed -e "/^line4/i test-line4=disable" /home/test.conf
line1=enable
line2=disable
line3=enable
test-line4=disable
line4=enable
line5=disable
line6=enable
line7=disable

「line4」から始まる行の後に挿入する場合は、以下のように実行する。

[root@test-centos ~]# sed -e "/^line4/a test-line4=disable" /home/test.conf
line1=enable
line2=disable
line3=enable
line4=enable
test-line4=disable
line5=disable
line6=enable
line7=disable

なお、「line」から始まる行で上記処理を行うと、以下のようになる。

[root@test-centos ~]# sed -e "/^line/a test-line4=disable" /home/test.conf
line1=enable
test-line4=disable
line2=disable
test-line4=disable
line3=enable
test-line4=disable
line4=enable
test-line4=disable
line5=disable
test-line4=disable
line6=enable
test-line4=disable
line7=disable
test-line4=disable

行の削除

4行目を削除するなど、削除する行が決まっている場合は、以下のように実行する。

[root@test-centos ~]# sed -e "4d" /home/test.conf
line1=enable
line2=disable
line3=enable
line5=disable
line6=enable
line7=disable

2行目~4行目を削除する場合は、以下のように実行する。

[root@test-centos ~]# sed -e "4d" /home/test.conf
[root@test-centos ~]# sed -e "2,4d" /home/test.conf
line1=enable
line5=disable
line6=enable
line7=disable

なお、最終行を指定したい場合は変数「$」を用いればいい。

「line4」から始まる行を削除する場合は、以下のように実行する。

[root@test-centos ~]# sed -e "/^line4/d" /home/test.conf
line1=enable
line2=disable
line3=enable
line5=disable
line6=enable
line7=disable

置換

「enable」を全て「disable」に置換する。

[root@test-centos ~]# sed -e "s/enable/disable/" /home/test.conf
line1=disable
line2=disable
line3=disable
line4=disable
line5=disable
line6=disable
line7=disable

1行目の「enable」を全て「disable」に置換する。

[root@test-centos ~]# sed -e "1s/enable/disable/" /home/test.conf
line1=disable
line2=disable
line3=enable
line4=enable
line5=disable
line6=enable
line7=disable

2~5行目の「enable」を全て「disable」に置換する。

[root@test-centos ~]# sed -e "2,5s/enable/disable/" /home/test.conf
line1=enable
line2=disable
line3=disable
line4=disable
line5=disable
line6=enable
line7=disable

line4を含む行の「enable」を「disable」に置換する。

[root@test-centos ~]# sed -e "/line4/s/enable/disable/" /home/test.conf
line1=enable
line2=disable
line3=enable
line4=disable
line5=disable
line6=enable
line7=disable

line4で始まる行の「enable」を「disable」に置換する。

[root@test-centos ~]# sed -e "/^line4/s/enable/disable/" /home/test.conf
line1=enable
line2=disable
line3=enable
line4=disable
line5=disable
line6=enable
line7=disable

3行目の内容がなんであれ、「line435=excel」に上書きする。

[root@test-centos ~]# sed -e "3c\line435=excel" /home/test.conf
line1=enable
line2=disable
line435=excel
line4=enable
line5=disable
line6=enable
line7=disable

line4で始まる行の内容がなんであれ、「line435=excel」に上書きする。

[root@test-centos ~]# sed -e "/^line4/c\line435=excel" /home/test.conf
line1=enable
line2=disable
line3=enable
line435=excel
line5=disable
line6=enable
line7=disable

保存

sedで編集した内容を保存するには、リダイレクトもしくは「i」オプションを用いる。

リダイレクトし、元のファイルに上書きする。 (直接リダイレクトで上書きすると、内容が全て消えてしまうので注意)

[root@test-centos ~]# sed -e "3c\line435=excel" /home/test.conf >> /home/text.conf.af
[root@test-centos ~]# mv /home/text.conf.af /home/text.conf
[root@test-centos ~]# cat /home/text.conf
line1=enable
line2=disable
line435=excel
line4=enable
line5=disable
line6=enable
line7=disable

編集した内容を直接上書きする。

[root@test-centos ~]# sed -i -e "3c\line435=excel" /home/test.conf
[root@test-centos ~]# cat /home/test.conf
line1=enable
line2=disable
line435=excel
line4=enable
line5=disable
line6=enable
line7=disable

編集した内容を直接上書きする。 (バックアップを取得する)

[root@test-centos home]# sed -i.bak -e "3c\line435=excel" /home/test.conf
[root@test-centos home]# cat /home/test.conf
line1=enable
line2=disable
line435=excel
line4=enable
line5=disable
line6=enable
line7=disable
[root@test-centos home]#
[root@test-centos home]# cat /home/test.conf.bak
line1=enable
line2=disable
line3=enable
line4=enable
line5=disable
line6=enable
line7=disable

複数の編集を実行

一行で記述する。

[root@test-centos ~]# sed -e "4i test-line4=disable" -e "2d" /home/test.conf
line1=enable
line3=enable
test-line4=disable
line4=enable
line5=disable
line6=enable
line7=disable

外部ファイルに記述して実行する。 以下では、外部ファイル「/home/sed_s.sc」にsedの変換コマンドを羅列し、それを「-f」オプションで読み込ませ実行している。

[root@test-centos ~]# cat /home/sed_s.sc
4i test-line4=disable
2d
[root@test-centos ~]#
[root@test-centos ~]# sed -f /home/sed_s.sc /home/test.conf
line1=enable
line3=enable
test-line4=disable
line4=enable
line5=disable
line6=enable
line7=disable

とまぁ、基本的な使用方法はこのようになるかなと。

昔から有名だったコマンドだけど、今まで使いこなせてなかったので、これを機に使えるようになろうと思う。

なおsedに関する本としては、有名な以下の本がある。

この本以外でsedに関して書いた本を今まで見かけた事が無いけど、とりあえずこれ一冊あれば事足りるのでは無いだろうか。