文字列置換で利用するsedコマンドの使い方を解説します。sedコマンドを活用すると「文字列の置換」以外に「文字列の挿入、削除」もできます。
目次
書式
sed [オプション] スクリプトコマンド 入力ファイル利用例
最初にマッチしたものを置換
test.txtファイル の各行で、 aaa と 最初にマッチした箇所 を AAA に置換します。
$ cat test.txt
111aaa222aaa
aaa222ccc444
ddd333aaa555
$
$ sed s/aaa/AAA/ test.txt
111AAA222aaa
AAA222ccc444
ddd333AAA555全て置換
test.txtファイル の各行で、 aaaにマッチする全ての箇所 を AAA に置換します。
$ cat test.txt
111aaa222aaa
aaa222ccc444
ddd333aaa555
$
$ sed s/aaa/AAA/g test.txt
111AAA222AAA
AAA222ccc444
ddd333AAA555置換して上書き
-iオプション を利用すると置換結果で上書きできます。
$ cat test.txt
111aaa222aaa
aaa222ccc444
ddd333aaa555
$
$ sed -i s/aaa/AAA/ test.txt
111AAA222aaa
AAA222ccc444
ddd333AAA555
$
$ cat test.txt
111AAA222aaa
AAA222ccc444
ddd333AAA555指定行を削除
3〜5行目を削除します。
$ cat test.txt
1111
2222
3333
4444
5555
6666
7777
$
$ sed '3,5d' test.txt
1111
2222
6666
7777空白削除
$ cat test.txt
<body>
<div class="main">
<p>Hello World!</p>
</div>
</body>
$
$ sed 's/ //g' test.txt
<body>
<divclass="main">
<p>HelloWorld!</p>
</div>
</body>空行削除
$ cat test.txt
1111
2222
3333
4444
5555
6666
7777
$
$ sed '/^$/d' test.txt
1111
2222
3333
4444
5555
6666
7777指定行の前後にテキスト挿入
- i
- 指定位置の前に挿入できます。
- a
- 指定位置の後ろに挿入できます。
$ cat test.txt
1111
2222
3333
4444
5555
6666
7777
$
$ sed '3i aaaaaaaaa' test.txt
1111
2222
aaaaaaaaa
3333
4444
5555
6666
7777
$
$ sed '3a aaaaaaaaa\nbbbbbbbbb' test.txt
1111
2222
3333
aaaaaaaaa
bbbbbbbbb
4444
5555
6666
7777指定キーワードの前後にテキスト挿入
$ cat test.txt
1111
2222
3333
4444
5555
6666
7777
$ sed '/4444/i aaaaaaaaa' test.txt
1111
2222
3333
aaaaaaaaa
4444
5555
6666
7777
$ sed '/4444/a aaaaaaaaa' test.txt
1111
2222
3333
4444
aaaaaaaaa
5555
6666
7777設定ファイルの設定値変更
sedを活用すると、設定値の変更処理もスクリプトに記述できます。
$ sed -i 's/^post_max_size.*/post_max_size = 100M/' /etc/php.ini
$
$ grep post_max_size /etc/php.ini
post_max_size = 100M複数ファイルをまとめて置換
以下ファイルが存在します。
$ tree
.
├── aaa
│ ├── 1.md
│ ├── 1.txt
│ ├── 2.md
│ └── 2.txt
└── bbb
├── 1.md
└── 1.txt
2 directories, 6 files
$
$ cat aaa/1.md
aaa
$ cat aaa/2.md
aaa
$ cat bbb/1.md
aaa拡張子が md のファイルを対象にして、まとめて置換する方法を紹介します。
以下のように、findコマンド と xargsコマンド を利用することで複数ファイルをまとめて操作できます。
$ find . -type f -name "*.md" | xargs sed -i s/aaa/AAA/
$
$ cat aaa/1.md
AAA
$ cat aaa/2.md
AAA
$ cat bbb/1.md
AAAMacでGNU版のsedを使う
Macで標準に格納されているsedはGNU版ではないので、先述したオプションを利用できないことがあります。
以下コマンドでGNU版のsedをインストールできます。
brew install gnu-sedインストール後、gsedコマンド を利用できます。