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

Linuxコマンドの基本:行の表示と削除を行う:sedコマンド

行の表示と削除を行う:sedコマンド

 テキスト処理やログの解析において、特定の行を表示・削除する操作は頻繁に行われます。sedコマンドは、これらの操作を効率的に行うための強力なツールです。ここでは、sedコマンドを使用して行の表示と削除を行う方法について解説します。

sedコマンドの概要

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

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

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

サンプルファイル「sample1.txt」の作成

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

user01@ubuntu:~$ nano sample1.txt

sample1.txtの内容:

01 Cl
02 Col
03 Cool
04 Coool
05 Cooool
06 Coooool
07 Cooooool!!!
08 CoolCool
09 CoolCoolCool
10 Japan Cool
11 Japan Hot
12 America Cool
13 America Hot

行を削除する

 dコマンドは、指定した行を削除するためのsedコマンドです。sedでは、アドレス(適用する行の指定)とコマンドを組み合わせて編集操作を行います。

アドレス指定の方法

  • 行番号で指定:特定の行番号を指定します。
  • 範囲指定n,mの形式で、n行目からm行目までを指定します。
  • 正規表現で指定/パターン/の形式で、パターンに一致する行を指定します。
  • 特殊記号$:最終行を示します。

1行目を削除する

アドレスに1を指定し、1行目を削除します。

user01@ubuntu:~$ sed 1d sample1.txt

出力結果

03 Cool
04 Coool
05 Cooool
06 Coooool
07 Cooooool!!!
08 CoolCool
09 CoolCoolCool
10 Japan Cool
11 Japan Hot
12 America Cool
13 America Hot

解説

  • 1dは、1行目を削除するコマンドです。元のファイルは変更されず、編集結果が標準出力に表示されます。

2行目から6行目を削除する

範囲指定で、2行目から6行目を削除します。

user01@ubuntu:~$ sed 2,6d sample1.txt

出力結果

01 Cl
07 Cooooool!!!
08 CoolCool
09 CoolCoolCool
10 Japan Cool
11 Japan Hot
12 America Cool
13 America Hot

解説

  • 2,6dは、2行目から6行目までを削除します。

5行目から最終行までを削除する

$を使用して、5行目から最終行までを削除します。

user01@ubuntu:~$ sed '5,$d' sample1.txt

出力結果

01 Cl
02 Col
03 Cool
04 Coool

解説

  • 5,$dは、5行目から最終行までを削除します。

注意点

  • $を使用する場合、シェルによる解釈を防ぐために、スクリプトをシングルクォートで囲みます。

全行を削除する

アドレスを省略すると、コマンドはすべての行に適用されます。

user01@ubuntu:~$ sed d sample1.txt

出力結果

(何も表示されません)

解説

  • dコマンドのみでアドレス指定がないため、全行が削除されます。

正規表現で指定した行を削除する

正規表現を使用して、先頭が0で始まる行を削除します。

user01@ubuntu:~$ sed '/^0/d' sample1.txt

出力結果

10 Japan Cool
11 Japan Hot
12 America Cool
13 America Hot

解説

  • /^0/は、行頭が0で始まる行を示します。この行に対してdコマンドを適用します。

行を表示する

 pコマンドは、指定した行を表示するためのsedコマンドです。ただし、sedのデフォルト動作により、パターンスペースの内容も自動的に出力されるため、期待通りの結果を得るためには注意が必要です。

サンプルファイル「sample2.txt」の作成

user01@ubuntu:~$ nano sample2.txt

sample2.txtの内容:

Cl
Col
Cool
Coool
Cooool
Coooool

1行目を表示しているが、合わせて全行表示されている

user01@ubuntu:~$ sed 1p sample2.txt

出力結果

Cl
Cl
Col
Cool
Coool
Cooool
Coooool

解説

  • 上の例では、1行目の「Cl」が2回表示され、その後に2行目以降の全行が表示されています。
  • これは、sedコマンドのパターンスペースの自動出力が原因です。

パターンスペースとは

  • パターンスペースsedコマンドがファイルを処理する際、各行を一時的に保持し、編集操作を行う作業領域です。
  • sedは各行を読み込むと、まずパターンスペースにコピーし、指定された編集コマンドを実行します。その後、パターンスペースの内容を自動的に出力します。
  • この動作がデフォルトで行われるため、特定の行だけを表示する場合に予期せぬ結果となることがあります。

なぜ「sed 1p sample2.txt」の出力がこうなるのか

  • ファイルの読み込み
    ・ファイルには、1行目に「Cl」、2行目に「Col」、3行目に「Cool」...と続いています。
    sedコマンドは、ファイルを処理する際に、1行ずつパターンスペースに読み込みます。
  • 1行目の処理
    ・最初に1行目の「Cl」がパターンスペースに読み込まれます。
    ・スクリプト1pにより、1行目に対してpコマンドが適用され、「Cl」が出力されます。
    ・その後、デフォルトの動作でパターンスペースの内容(「Cl」)が再度出力されます。
  • 次の行の読み込みと出力
    ・パターンスペースの内容が出力された後、2行目の「Col」がパターンスペースに読み込まれます。
    ・この行は1pの対象外なので、編集は行われません。
    ・デフォルトの動作でパターンスペースの内容(「Col」)が出力されます。
  • 以降の行も同様に処理される
    ・3行目以降も同様に、パターンスペースに読み込まれ、その内容が出力されます。

パターンスペースの自動出力を抑制する

  • パターンスペースの自動出力を抑制するには、-nオプションを使用します。
  • -nオプションを使用すると、sedはデフォルトの出力を行わなくなり、pコマンドで指定した行だけが出力されます。

正しく1行目だけを表示する

user01@ubuntu:~$ sed -n 1p sample2.txt

出力結果

Cl

解説

  • -nオプションでデフォルトの出力を抑制します。
  • 1pコマンドで、1行目だけを明示的に表示します。

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

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

user01@ubuntu:~$ rm sample1.txt sample2.txt

まとめ

  • sedコマンドは、非対話型でテキストの編集を行う強力なツールです。
  • 行の削除にはdコマンド、行の表示にはpコマンドを使用します。
  • アドレス指定を活用することで、特定の行や範囲、パターンに一致する行に対して編集操作を適用できます。
  • パターンスペース自動出力の動作を理解し、-nオプションを適切に使用することで、期待通りの結果を得ることができます。
  • 元のファイルは変更されないため、安全に編集操作を試すことができます。

 sedコマンドを使いこなすことで、日々の業務におけるテキスト処理を効率化し、生産性を向上させましょう。