このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Linuxコマンドの基本:行を置換する:sedコマンド

行を置換する:sedコマンド

 テキスト処理において、特定の文字列を他の文字列に置換する操作は非常に重要です。sedコマンドは、このような置換を効率的に行うための強力なツールです。ここでは、sedコマンドを使用して行を置換する方法について詳しく解説します。

sedコマンドの概要

 sedStream Editor)は、非対話型のストリームエディタであり、テキストデータを一括で処理することができます。sedコマンドを使用すると、ファイルを直接編集することなく、指定した編集操作の結果を標準出力に表示できます。

【書式】
sed [オプション] '<スクリプト>' <対象ファイル>

  • [オプション]:コマンドの動作を変更するためのオプション。
  • '<スクリプト>':実行する編集コマンド。シングルクォートで囲みます。
  • <対象ファイル>:編集対象のファイル名。

サンプルファイルの作成

まず、sedコマンドの動作を確認するためのサンプルファイルを作成します。

user01@ubuntu:~$ nano sample.txt

sample.txtの内容

Cl
Col
Cool
Coool
CoolCool
CoolCoolCool
CoolCoolCoolCool
Coool!
Cooool!!
Coooool!!!

行を置換する

sedコマンドのsは、文字列を置換するためのコマンドであり、最も頻繁に使用されます。

sコマンドの基本書式

s/置換前文字列/置換後文字列/フラグ

  • 置換前文字列:置換したい文字列または正規表現パターン。
  • 置換後文字列:置換後の文字列。
  • フラグ:省略可能。gなどのフラグを指定できます。

例1:「Cool」を「Hot」に置換

 次のコマンドでは、「Cool」を「Hot」に置換します。アドレス指定を省略しているため、ファイル全体が対象となります。

user01@ubuntu:~$ sed 's/Cool/Hot/' sample.txt

出力結果

Cl
Col
Hot
Coool
HotCool
HotCoolCool
HotCoolCoolCool
Coool!
Cooool!!
Coooool!!!

解説

  • s/Cool/Hot/:各行で最初に見つかった「Cool」を「Hot」に置換します。
  • 5行目以降で「Cool」が残っているのは、各行で最初の一致のみが置換されるためです。

置換は最初の一致のみが対象

 たとえば、「CoolCoolCool」という文字列に対して、上記のコマンドを適用すると以下のようになります。

CoolCoolCool
   ↓
$ sed 's/Cool/Hot/' sample.txt
 [Cool]を[Hot]に置換
   ↓
HotCoolCool

最初の「Cool」だけが「Hot」に置換され、残りはそのままです。

例2:すべての一致を置換する(gフラグの使用)

すべての「Cool」を「Hot」に置換するには、gフラグを使用します。

user01@ubuntu:~$ sed 's/Cool/Hot/g' sample.txt

出力結果

Cl
Col
Hot
Coool
HotHot
HotHotHot
HotHotHotHot
Coool!
Cooool!!
Coooool!!!

解説

  • gフラグを付けることで、行内のすべての「Cool」が「Hot」に置換されます。

例3:正規表現を使用した置換

 置換前文字列に正規表現を利用することができます。次のコマンドでは、「C」で始まり「l」で終わる文字列を「Hot」に置換しています。

user01@ubuntu:~$ sed 's/C.*l/Hot/g' sample.txt

出力結果

Hot
Hot
Hot
Hot
Hot
Hot
Hot
Hot!
Hot!!
Hot!!!

解説

  • C.*lCで始まりlで終わる任意の文字列を表す正規表現。
  • 全行でパターンに一致する部分が「Hot」に置換されています。

注意点

  • 正規表現を使用する際は、スクリプト全体をシングルクォートで囲むことをおすすめします。

例4:特定の文字を削除する

 置換後文字列を空にすることで、特定の文字を削除することができます。次の例では、「!」を削除しています。

user01@ubuntu:~$ sed 's/!//g' sample.txt

出力結果

Cl
Col
Cool
Coool
CoolCool
CoolCoolCool
CoolCoolCoolCool
Coool
Cooool
Coooool

解説

  • s/!//g:全行で「!」を空文字に置換(削除)します。

例5:置換が発生した行のみを表示する

 -nオプションとpフラグを組み合わせることで、置換が行われた行だけを表示することができます。これは、大量のテキストから置換が行われた箇所を確認するのに便利です。

user01@ubuntu:~$ sed -n 's/!//gp' sample.txt

出力結果

Coool
Cooool
Coooool

解説

  • -nオプション:デフォルトの出力を抑制します。
  • pフラグ:置換が行われた行を表示します。
  • 「!」が存在して置換が発生した行のみが出力されています。

不要なファイルを削除する

作業が終わったら、サンプルファイルを削除します。

user01@ubuntu:~$ rm sample.txt

まとめ

  • sコマンドsedで文字列を置換するための基本コマンド。
  • フラグの活用
    g:行内のすべての一致部分を置換。
    p:置換が発生した行を表示(-nオプションと併用)。
  • 正規表現の利用:柔軟なパターン指定が可能。
  • 文字の削除:置換後文字列を空にすることで削除を実現。

 sedコマンドを使いこなすことで、テキスト処理の作業効率を大幅に向上させることができます。特に置換操作は日常的によく使われるため、ぜひ習得しておきましょう。