Bash 速習チュートリアル

Bash sedコマンド

1. sedコマンドの使用方法

sed(Stream Editor)コマンドは、入力ストリーム(ファイルやパイプラインからの入力)に対して基本的なテキスト変換を行うために使用されるストリームエディタです。
ファイルやデータストリームを素早く編集するための非常に強力なツールです。

以下のすべての例では、次の example_text.txt ファイルを使用します:

Hello World
Line 1
Line 2

1.1 基本的な使い方

ファイル内で最初に見つかったパターンを置換するには、sed 's/検索パターン/置換文字列/' ファイル名 の形式で使用します。

例:テキストの置換

sed 's/World/Bash/' example_text.txt
# 出力結果:
# Hello Bash
# Line 1
# Line 2

2. オプション

sedコマンドには、動作をカスタマイズするための様々なオプションが用意されています。

  • -i - 別途保存することなく、ファイルを直接編集(上書き)する
  • -e - 実行するコマンドにスクリプトを追加する
  • -n - 各行を自動的に出力しない(抑制モード)
  • -r - 拡張正規表現(Extended Regular Expressions)を使用する
  • -f - 外部ファイルからスクリプトを読み込む
  • -l - lコマンドで使用する行の長さを指定する

2.1 ファイルを直接編集(インプレース編集)

-iオプションを使用すると、結果を標準出力に表示するのではなく、ファイルを直接書き換えることができます。
このオプションを指定しない場合、sedは結果を標準出力に表示するだけなので、変更を保存するにはリダイレクトを行う必要があります。

例:ファイルを直接編集

sed -i 's/World/Bash/g' example_text.txt
# 内容を確認
cat example_text.txt
# 出力結果:
# Hello Bash
# Line 1
# Line 2

2.2 出力の抑制

-nオプションは、パターンスペースの自動出力を抑制します。
デフォルトでは sed はすべての行を出力しますが、-n を使用することで、通常は p(print)コマンドと組み合わせて、特定の条件に一致した行だけを出力させることが可能になります。

例:出力の抑制と特定行の表示

sed -n 's/World/Bash/p' example_text.txt
# 出力結果:
# Hello Bash

2.3 拡張正規表現の使用

-rオプションを使用すると、基本正規表現よりも強力なパターンマッチング機能を持つ拡張正規表現が利用可能になります。
このオプションがない場合、sedはデフォルトで基本正規表現を使用します。

例:拡張正規表現

sed -r 's/(World|Line)/Hello/g' example_text.txt
# 出力結果:
# Hello Hello
# Hello 1
# Hello 2

2.4 ファイルからスクリプトを読み込む

-fオプションを使用すると、外部ファイルに記述されたスクリプトを読み込んで実行できます。これは、複雑なコマンドや複数の処理をまとめて実行したい場合に非常に便利です。

script.sed ファイルの内容:

s/World/Bash/g

例:ファイルからスクリプトを実行

sed -f script.sed example_text.txt
# 出力結果:
# Hello Bash
# Line 1
# Line 2

2.5 行の長さの指定

-lオプションは、非表示文字を表示する l コマンドにおいて、1行あたりの長さを指定します。
長い行を整形して出力したい場合に役立ちます。

例:行の長さを指定

sed -l 10 'l' example_text.txt
# 出力結果例:
# Hello Wor\
# ld$
# Hello World
# Line 1$
# Line 1
# Line 2$
# Line 2

※このオプションを使用すると、各行の末尾に改行を示す $ 記号が付与されます。

3. 出力をファイルへリダイレクト

sedによる変更内容を新しいファイルとして保存したい場合は、出力をリダイレクトします。元のファイルを上書きしたくない場合に有効な手法です。

例:出力のリダイレクト

sed 's/World/Bash/' example_text.txt > new_example_text.txt
# 新しいファイルを確認
cat new_example_text.txt
# 出力結果:
# Hello Bash
# Line 1
# Line 2

4. 高度なテキスト処理への応用

sedは高度なテキスト編集タスクをこなせます。例えば、sed 's/^/Prefix: /' example_text.txt と実行すれば、すべての行の先頭に接頭辞(Prefix)を付与できます。

例:高度なテキスト処理

sed 's/^/Prefix: /' example_text.txt
# 出力結果:
# Prefix: Hello World
# Prefix: Line 1
# Prefix: Line 2

5. 一般的なエラーとトラブルシューティング

sedを使用する際によく遭遇するエラーには以下のようなものがあります。

  • "sed: command garbled" - コマンドの構文(シンタックス)に誤りがないか確認してください。特にデリミタ(スラッシュなど)の閉じ忘れに注意が必要です。
  • "sed: can't read file" - ファイルパスが正しいか、読み込み権限があるかを確認してください。

デバッグのヒント:
複雑なロジックを組む際は、echoを使用して中間結果を出力し、意図した通りのパターンマッチングが行われているか段階的に検証するのが効率的です。