sed
を使ったテキスト変換
1. sedコマンドの構文
sed
って何?
sed
(Stream Editorの略、つまりストリームエディタ)は、テキストを処理するための強力なユーティリティで、テキストファイルやデータストリーム内の行を変更、追加、削除、または変換することができるんだよね。
sed
の一番のマジックは、オリジナルファイルに手を触れずに(もし自分で要求したなら別だけど)テキストを「その場で」編集するところ。これが、データを迅速かつ自動的に変換するツールとして理想的なんだ。
コマンドの基本構文
sed
を使うための基本的なフォーミュラを見てみよう:
sed [オプション] 'パターン/アクション' ファイル
ここで:
パターン
— 検索するテキストまたは正規表現。アクション
— 実行したい操作(例:テキストの置換)。ファイル
— 編集したい行を含むテキストファイル。
初めのうちは、もっともよく使われる操作に集中するのが分かりやすいよね:テキスト置換(s
= "substitute"の略)と行の削除(d
= "delete"の略)。
2. テキストの置換 s/古いもの/新しいもの/
例 1: 基本的なテキスト置換
例として、次の内容を持つファイル example.txt
があります:
Hello world!
Welcome to Linux.
Linux is awesome.
単語「Linux」をsed
に置き換えてみましょう:
sed 's/Linux/sed/' example.txt
出力は以下のようになります:
Hello world!
Welcome to sed.
sed is awesome.
それでおしまい。「Linux」という単語は各行で1回だけsed
に置き換えられました。これが標準の動作です。
例 2: グローバル置換
行内で最初の一致だけではなくすべての一致を置き換えるには、g
フラグ(グローバル)を追加します:
sed 's/Linux/sed/g' example.txt
行内に「Linux」の複数の例がある場合、そのすべてがsed
に置き換えられます。
例 3: 大文字小文字を無視する置換
ケースを無視してテキストを置き換えるには、I
(またはバージョンによってはi
)フラグを追加します:
sed 's/linux/sed/gi' example.txt
これにより、「Linux」、「LINUX」、「LiNuX」などがすべて置き換えられます。
例 4: 結果を保存する置換
デフォルトではsed
は、結果をコンソールに出力するだけでファイルを変更しません。変更をファイルに保存したい場合は、-i
(インプレース)オプションを追加します:
sed -i 's/Linux/sed/g' example.txt
これでexample.txt
ファイルが更新され、置換が反映されます。
3. 行の削除 /パターン/d
例 1: パターンで行を削除する
すべての行に「Linux」という単語が含まれている場合、それらを削除したい場合:
sed '/Linux/d' example.txt
出力は次のようになります:
Hello world!
ここでは、「Linux」が含まれる行が削除されました。
番号による行の削除
行番号で削除することができます。例えば、2行目を削除するには、次を使用します:
sed '2d' example.txt
出力:
Hello world!
Linux is awesome.
複数の行を削除するには、範囲を指定します。例えば、2行目から3行目までを削除するには:
sed '2,3d' example.txt
4. 正規表現の使い方
ここがsed
の本領発揮!パターンに正規表現を使って、もっと複雑な一致を探せるんだ。
例1: 特定のパターンを持つ単語の置換
たとえば、テキストに以下の行があるとする:
error: something went wrong
warning: check your system
error: unable to connect
"error"で始まるすべての行を"Issue Detected"に置き換えたいとする。ここで正規表現が役立つ:
sed 's/^error:.*/Issue Detected/' logs.txt
これが意味するのは:
^
— 行の先頭を示す。.*
— "その後の何でも"を意味する。
結果:
Issue Detected
warning: check your system
Issue Detected
5. 行の挿入と追加
一致する前に行を挿入する
"Linux"を含む各行の前に行を挿入するには:
sed '/Linux/i\# 学ぶのは楽しい' example.txt
結果:
Hello world!
Welcome to Linux.
# 学ぶのは楽しい
Linux is awesome.
例2: 一致する後に行を追加する
パターンが一致する行の後にテキストを追加するには:
sed '/Linux/a\# sedは簡単にしてくれる' example.txt
結果:
Hello world!
Welcome to Linux.
# sedは簡単にしてくれる
Linux is awesome.
# sedは簡単にしてくれる
6. 実践: 設定ファイルの処理
実際のタスクを解いてみよう。config.txt
という設定ファイルがあると想像してみて:
host=localhost
port=8080
mode=production
logfile=/var/log/app.log
タスク 1: "localhost" を "127.0.0.1" に置換する
sed -i 's/localhost/127.0.0.1/' config.txt
結果:
host=127.0.0.1
port=8080
mode=production
logfile=/var/log/app.log
タスク 2: ポートを1増やす
これにはsed
を使ってちょっとしたトリックをやるよ:
sed -i 's/port=8080/port=8081/' config.txt
結果:
host=127.0.0.1
port=8081
mode=production
logfile=/var/log/app.log
タスク 3: logfile
を含む行を削除
もしログ記録が不要になったら、その行を削除しよう:
sed -i '/logfile/d' config.txt
結果:
host=127.0.0.1
port=8081
mode=production
7. 他のコマンドとの組み合わせ
sed
は、Linuxの他のツールと組み合わせるとめっちゃ便利だよ。例えば:
grep "error" logs.txt | sed 's/error/ERROR/'
ここでは、最初にエラー行を探して、それからそれをフォーマットしてるよ。
典型的なミスとその回避方法
- ミス: オプション
-i
を忘れる。初心者は、sed
がファイルを変更すると期待してるけど、-i
を付けないことがある。ファイルに変更を加えたい場合は、必ずこれを指定しよう。 - ミス: クォートの問題。一部のシステムでは、特にシングルクォートを使う場合、
\
が特殊文字の前でうまく動かないことがある。常に正しくエスケープしよう。 - ミス: 行の範囲指定。範囲を使う場合(例えば、
2,3d
)、正しく指定されているか確認しよう。ファイルが空にならないようにね。
GO TO FULL VERSION