文字列置換で利用する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
AAA
MacでGNU版のsedを使う
Macで標準に格納されているsedはGNU版ではないので、先述したオプションを利用できないことがあります。
以下コマンドでGNU版のsedをインストールできます。
brew install gnu-sed
インストール後、gsedコマンド
を利用できます。