連載
» 2016年10月13日 05時00分 UPDATE

Linux基本コマンドTips(55):【 sed 】コマンド(基礎編その3)――行を追加する/挿入する

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

[西村めぐみ,@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で新しい行を追加するには、「i」コマンドまたは「a」コマンドを使用します。「i」コマンドの場合は指定した行の前に挿入(insert)され、「a」コマンドの場合は指定した行の後ろに追加(append)されます。

 追加する場所は、「行番号」または「/パターン/」で指定します。例えば、先頭に「LIST」という行を追加する場合は、“1行目の前に挿入”なので「1iLIST」と指定します。

 最終行は「$」で指定します。例えば、最終行の後ろに「END」という行を追加する場合は、「$aEND」と指定します。ただし、コマンドラインでは「$aEND」が“変数「aEND」の参照”という意味になってしまうので、「\」を付けるかシングルクオート(')で囲みます。

※ダブルクオート("〜")の場合、「$」が展開されるので使用できません。



 「1iLIST」と「$aEND」の両方を実行したい場合は、「-e」オプションで指定するか、スクリプトファイルを使います(実行例5参照)。

コマンド実行例

cat /etc/shells | sed 1iLIST

cat /etc/shells | sed \$aEND

cat /etc/shells | sed '$aEND'

cat /etc/shells | sed -e 1iLIST -e \$aEND

(先頭に「LIST」という行、末尾に「END」という行を追加する)(画面1


画面1 画面1 先頭に「LIST」という行、末尾に「END」という行が追加された


間隔を指定してコマンドを実行する

 行番号は「開始行,終了行」のような指定の他、「開始行~行数」で指定行数ごとにコマンドを実行させることができます。このような行指定は「s」コマンド(置き換えコマンド)など、他のコマンドでも使用できます(「p」コマンド、「d」コマンドでの指定例:本連載第54回を参照)。

コマンド実行例

cat /etc/shells | sed 1,2i----

(1行目と2行目の前に「----」を挿入する)(画面2の赤枠部分

cat /etc/shells | sed 1~2i----

(1行目から、2行ごとに「----」を挿入する)(画面2の青枠部分


画面2 画面2 1行目と2行目の前に「----」が挿入され(赤枠部分)、1行目の前およびその後は2行ごとに「----」が挿入された(青枠部分)


複数行を追加する

 「i」コマンドや「a」コマンドで複数の行を追加したい場合は、追加する行を「\n」で区切って指定します。

コマンド実行例

cat /etc/shells | sed "1iLIST\n----"

(行の先頭に「LIST」と「----」を追加する)(画面3


画面3 画面3 先頭に「LIST」という行と「----」という行が追加された


行頭や行末に文字列を追加する

 行の追加や挿入ではなく、行頭や行末に文字列を追加したい場合は、「s」コマンドを使います。行頭は「^」で表すことができるので、「s/^/--/」で行頭に「--」という文字列を追加できます。

 また、空白を含みたい場合には、「引用符(")」を使用します。「s/^/"-- "/」のように置き換え後の文字列に指定することもできますが、「s」コマンド全体を囲む方が分かりやすいでしょう。

コマンド実行例

cat /etc/shells | sed "s/^/-- /"

(行頭に「-- 」を追加する)


画面4 画面4 行頭に空白を含む「-- 」が追加された

 行末は「$」で表します。また、「行頭と行末に入れたい」という場合は、正規表現を使い、「"s/.*/-- & --/"」のように指定します。

 「.*」は任意の文字列で、この場合は行全体にマッチします。置換後の文字列の「&」は、マッチした行全体を取り出すという意味になります(「$」を使って改行コードを変換する例:本連載第53回参照)。

コマンド実行例

cat /etc/shells | sed "s/$/ --/"

cat /etc/shells | sed "s/\/.*/-- & --/"

(行頭に「-- 」、行末に「 --」を追加する)(画面5


画面5 画面5 行頭に「-- 」、行末に「 --」が追加された


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

 スクリプトは別のファイルに書いておくこともできます。この場合、「$」や空白のためのエスケープは不要です。

 スクリプトのファイルはテキストで、1コマンド1行で記述します。複数の行に分けて書きたい場合は行末に「\」記号を入れます。

 ファイル名や拡張子は自由です。ここでは「line.sed」というファイルを使用しています。

コマンド実行例

cat /etc/shells | sed -f line.sed

(「line.sed」に書かれているスクリプトコマンドを実行する)(画面6


画面6 画面6 「line.sed」でテキストを加工し(赤枠部分)、最後に「expand」コマンドでタブ(\t)を21文字の空白に展開して行の長さを整えている(青枠部分)


筆者紹介

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

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


Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

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

メールマガジン登録

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