このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。
Linuxコマンドの基本:行の表示と削除を行う:sedコマンド
行の表示と削除を行う:sedコマンド
テキスト処理やログの解析において、特定の行を表示・削除する操作は頻繁に行われます。sed
コマンドは、これらの操作を効率的に行うための強力なツールです。ここでは、sed
コマンドを使用して行の表示と削除を行う方法について解説します。
sedコマンドの概要
sed
(Stream 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
コマンドを使いこなすことで、日々の業務におけるテキスト処理を効率化し、生産性を向上させましょう。