【 sed 】コマンド(基礎編その2)――行番号/パターンを指定して削除するLinux基本コマンドTips(54)

本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。前回に続き、今回も「sed」コマンドの基礎を解説します。

» 2016年10月11日 05時00分 公開
[西村めぐみ@IT]
「Linux基本コマンドTips」のインデックス

Linux基本コマンドTips一覧

 本連載では、Linuxの基本的なコマンドについて、基本的な書式からオプション、具体的な実行例までを分かりやすく紹介していきます。今回も、テキストファイルを編集する「sed」コマンドの基礎的な使い方を解説します。

sedコマンドとは?

 「sed」は「Stream EDitor」の略で、「sed スクリプトコマンド ファイル名」で、指定したファイルをコマンドに従って処理し、標準出力へ出力します。ファイル名を省略した場合は、標準入力からのデータを処理します。sedコマンドでは、パイプとリダイレクトを活用するのが一般的です。


sedコマンドの書式

sed [オプション]

sed [オプション] スクリプトコマンド 入力ファイル

※[ ]は省略可能な引数を示しています




sedコマンドの主なオプション

 sedコマンドの主なオプションは次の通りです。

短いオプション 長いオプション 意味
-r --regexp-extended スクリプトで拡張正規表現を使用する
-e スクリプト --expression=スクリプト スクリプト(コマンド)を追加する
-f スクリプトファイル --file=スクリプトファイル 実行するコマンドとしてスクリプトファイルの内容を追加する
-i --in-place ファイルを直接編集する
-i拡張子 --in-place=拡張子 ファイルを直接編集し、指定した拡張子でバックアップする(※「-i」と「拡張子」の間には空白を入れない)
--follow-symlinks -iで処理する際にシンボリックリンクをたどる
-n --quiet,--silent 出力コマンド以外の出力を行わない(デフォルトでは処理しなかった行はそのまま出力される)
-l 文字数 --line-length=文字数 lコマンドの出力行を折り返す長さを指定する(※「-l」と「文字数」の間には空白を入れる)
-s --separate 複数の入力ファイルを一続きのストリームとして扱わずに個別のファイルとして扱う
-u --unbuffered 入力ファイルからデータをごく少量ずつ取り込み、頻繁に出力バッファを掃き出す
-z --null-data NUL文字で行を分割する(通常は改行で分割)
--posix 全てのGNU拡張を無効にする


sedのスクリプトコマンド

 sedでは、「アドレス」と「コマンド」の組み合わせで処理を指定します。

 アドレスには行番号や正規表現による指定が可能で、省略した場合は全ての行が処理の対象となります。


●sedの主なスクリプトコマンド
コマンド 意味
= 現在の行番号を出力する
a テキスト テキストの追加。指定した位置の後ろに[テキスト]を挿入する(挿入するテキストに改行を含める場合は、改行の前にバックスラッシュを置く)
i テキスト テキストの挿入。指定した位置の後ろに[テキスト]を挿入する(挿入するテキストに改行を含める場合は、改行の前にバックスラッシュを置く)
c テキスト 選択した行を[テキスト]で置換する(挿入するテキストに改行を含める場合は、改行の前にバックスラッシュを置く)
q これ以上入力を処理せずに終了する(未出力分があれば、出力してから終了する)
Q これ以上入力も出力もせずに終了する
d 指定した行を削除する
p 処理した内容を出力する(「-n」オプション指定時は「p」コマンドがないと何も出力されなくなる)
s/置換前/置換後/ [置換前]で指定した文字列にマッチした部分を[置換後]に置き換える。複数マッチした場合は先頭のみ置換、全てを置換したい場合は、「s/置換前/置換後/g」のように「g」オプションを指定する
y/元の文字列/対象文字列/ [元の文字列]にあるものを、対象文字列の同じ位置にある文字に置換する(「tr」コマンドのように使用できる)
# コメント(スクリプト中、「#」以降がコメントとなる)

※本連載で紹介しているのは、sedコマンドの一部になります。さらに活用するには、sedの独特な用語である「パターンスペース」「ホールドスペース」と、sedコマンドの処理の流れを把握する必要があります。

 sedコマンドは、(1)1行データを読み込み、「パターンスペース」と呼ばれる記憶領域に保存する(2)パターンスペースに保存されているデータに対して処理を行う(3)パターンスペースの内容を出力してパターンスペースを空にする(1)に戻り次の行へ、というサイクルで処理を行います(「-n」オプションが指定されている場合は(3)で出力せず、パターンスペースを空にします)。

 「ホールドスペース」はデータを保持しておくための“待避所”のような場所で、sedには、パターンスペースの内容をホールドスペースにコピーするコマンドや、パターンスペースとホールドスペースを交換するコマンド、パターンスペースをファイルに出力するコマンドがあります。





行番号を指定して削除する

 例えば、1行目を削除(d)するなら「sed 1d」、1〜5行目を削除するなら「sed 1,5d」と指定します。

コマンド実行例

ls -l / | sed 1d

(「ls -l」の1行目(合計の行)を削除する)(画面1

cat /etc/netconfig | sed 1,12d

(1〜12行目を削除する)


画面1 画面1 「ls -l」コマンドの結果から1行目を削除した

※CentOSではデフォルトで「ls」がカラー出力されるようにエイリアスが設定されていますが、実行結果を分かりやすくするために、ここでは「unalias ls」でエイリアスを解除した状態で実行しています。





パターンを指定して削除する

 行番号ではなく「“合計”から始まる行を削除」のように指定したい場合は、「/^合計/d」とします。「^」は行頭を意味する正規表現です。

 sedコマンドは、デフォルトでは基本正規表現、「-r」オプションを指定した場合は拡張正規表現が使用できます。

コマンド実行例

ls -l | sed /^合計/d

(「ls -l」の“合計”から始まる行を削除する)(画面2


画面2 画面2 「ls -l」コマンドの結果から“合計”で始まる行を削除した


行を指定して出力する

 指定した行だけを出力したい場合は、「-n」オプションで全体の出力を抑制して、「p」コマンドで出力します。

 例えば、2〜4行目を出力したい場合は「2,4p」とします。行番号ではなくパターンで指定したい場合は「/パターン/p」とします。

コマンド実行例

ls -l | sed -n 2,4p

(「ls -l」の2行目〜4行目だけを出力する)

ls -l | sed -n /^-/p

(「-」から始まる行だけを出力。通常ファイルの行だけが出力される)(画面3


画面3 画面3 「ls -l」コマンドの結果から、「-」から始まる行だけを出力した(通常ファイルだけが表示された)


複数の処理を行う

 sedのスクリプトコマンドを複数指定したい場合は、「-e」オプションを使います。

コマンド実行例

ls -l | sed -n -e 2p -e 5,6p

(「ls -l」の2行目と5〜6行目だけを出力する)(画面4


画面4 画面4 「ls -l」コマンドの2行目と5〜6行目だけが出力された


スクリプトファイルで処理を指定する

 スクリプトファイルは、別のファイルとして記述し、用意しておくこともできます。同じ処理を繰り返したり、複雑な処理を実行したりしたい場合に便利です。

 スクリプトファイルはテキストで、1コマンド1行で記述します。ファイル名や拡張子は自由です。ここでは「print.sed」というファイルを使用しています。

コマンド実行例

ls -l | sed -f print.sed

(スクリプトファイル「print.sed」を指定して、処理を行う)(画面5


画面5 画面5 「print.sed」には「2p」と「5,6p」が書かれている。「-f」で「print.sed」を指定し、「p」コマンドで出力しているので「-n」オプションも併用している


筆者紹介

西村 めぐみ(にしむら めぐみ)

PC-9801N/PC-386MからのDOSユーザー。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。のち退社し、専業ライターとして活動を開始。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『はじめてでもわかるSQLとデータ設計』『シェルの基本テクニック』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。