sedコマンド(文字列置換)の使い方(行挿入, 複数ファイル指定)

文字列置換で利用する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コマンド を利用できます。

よかったらシェアしてね!
目次