CodeGym /コース /Docker SELF /sedを使ったテキスト変換

sedを使ったテキスト変換

Docker SELF
レベル 8 , レッスン 1
使用可能

sedを使ったテキスト変換

1. sedコマンドの構文

sedって何?

sedStream 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)、正しく指定されているか確認しよう。ファイルが空にならないようにね。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION