目次
1. sed コマンドの形式
sed コマンドは、
- ファイルの内容を受け取り、
- 何らかの加工を行い、
- その結果を出力する
という処理を実行するコマンドです。
この sed コマンドの基本的な使い方を説明します。
まず、sed の基本的なコマンドの形式は以下です。
$ sed 'sedのコマンド' ファイル名1 ファイル名2 ...
- 「sedのコマンド」というのは、sed が持っているコマンドで、いろいろなものがあります。※ この部分は、実際は複数のリストを指定できるのですが、本記事では 1つだけしか指定しません。
上記のコマンドは以下を実行します。
- ファイル名1、ファイル名2、… のファイルをこの順番で読み込む
- 読み込んだファイルに対して、sedのコマンド(複数あり)を順番に適用する。
- その結果を出力する
2. これを踏まえて、簡単なコマンド例を紹介します。
(1) 読み込んだファイルの頭から30行を表示する
$ sed '5q' file1, file2
5
:行番号q
:指定された行で処理を終了するコマンドfile1 file2
:2つのファイルをこの順番で読み込む。読み込んでしまえば、それが入力のまとまりとなり、file1 とか file2 とかは関係なくなる。
こんな感じで、「行の指定」+「コマンド」を与えています。
(2) 指定した行以外を表示する
$ sed '5d' file1, file2
5
:行番号d
:指定された行は表示させないコマンド(削除する)file1 file2
:2つのファイルをこの順番で読み込む。読み込んでしまえば、それが入力のまとまりとなり、file1 とか file2 とかは関係なくなる。
(3) 指定した行だけを表示する
$ sed -n '5p' file1, file2
5
:行番号p
:指定された行を出力するコマンド-n
:指定された行以外は出力しないfile1 file2
:2つのファイルをこの順番で読み込む。読み込んでしまえば、それが入力のまとまりとなり、file1 とか file2 とかは関係なくなる。
(4) 指定した範囲の行だけを表示する
$ sed -n '20,30p' file1, file2
20,30
:20行目から30行目の範囲を指定している。- あとは (3) と同様
先程まで「行番号」を指定していたところで、このように「行の範囲」を指定することもできます。
(5) 指定したパターンに合致した行だけを表示する
$ sed -n '/foo/p' file1, file2
/foobar/
:スラッシュで囲まれた部分がパターンです。(3) で「行番号」で指定していたのを、「パターン」での指定に変えただけです。
(6) パターン1 に合致する行から、パターン2 に合致する行までの範囲だけを表示する
$ sed -n '/foo/,/bar/p' file1, file2
/foo/,/bar/
:(4) で「20,30」と指定していたところを、「/パターン1/, /パターン2/」に変えただけです。
(7) foo の部分を bar に置換する
$ sed 's/foo/bar/g' file1, file2
s/foo/bar/g
:”foo” という部分があったら、”bar” に置換します。最後に g を指定すると、1行の中に複数回 foo があった場合でも全て置換してくれます。これも1つのコマンドです。
3. おわりに
本記事では、基本的なコマンド実行例を紹介しました。
sed コマンドはいろいろなことができすぎて、引数の指定の仕方に一貫性がないように思え、引数の指定方法を記憶する妨げになりがちです。
しかし、本記事で紹介したコマンド実行例のどれもが、
$ sed 'sedのコマンド' ファイル名1 ファイル名2 ...
という形式に従っていることが分かります。
具体的には、「d
」「q
」「p
」「s/pattern1/pattern2/
」という「sed のコマンド」を紹介しました。
この「基本的な形式」だけ覚えておけば、sed コマンドがより使いやすくなると思います。