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

Linux基本コマンドTips(56):【 sed 】コマンド(基礎編その4)――文字列を置き換える/置換した行を出力する

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

[西村めぐみ,@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」コマンドのように使用できる)
# コメント(スクリプト中、「#」以降がコメントとなる)



文字列を置き換える

 文字列の置き換えは「s」コマンドを使って、「s/置換前/置換後/」と指定します。例えば、文字列「GNU」を「gnu」に置き換えるならば、「s/GNU/gnu/」と指定します。

 置き換えのパターンには、正規表現や部分文字列の指定も可能です(次回解説)。

コマンド実行例

sed s/GNU/gnu/ ファイル名

(「GNU」を「gnu」に置き換える)

cat ファイル名 | sed s/GNU/gnu/

(「GNU」を「gnu」に置き換える)(画面1


画面1 画面1 「GNU」が「gnu」に置き換わった。元のテキストは「sed --version | head -5 > sample.txt」で作成


置換した行だけを出力する

 文字を置換した行だけを出力するには、sedの出力を抑制する「-n」オプションを使い、「s/置換前/置換後/p」のように指定して、「s」コマンドを「p」フラグ付きで実行します。

コマンド実行例

sed -n s/GNU/gnu/p ファイル名

(「GNU」を「gnu」に置換後、置き換えた行だけを出力する)

cat ファイル名 | sed -n s/GNU/gnu/p

(「GNU」を「gnu」に置換後、置き換えた行だけを出力する)(画面2


画面2 画面2 「GNU」を「gnu」に置換後、置換された行だけが表示された


処理を繰り返す

 「s」コマンドは、デフォルトでは1行の処理で最初に見つけたパターンを置き換えたら終了します。各行に含まれる全てのパターンを置き換えたい場合は、「s」コマンドに「g」オプションを付けて実行します。

 また、「p」フラグと「g」フラグを同時に指定することも可能です。「p」と「g」の指定順はどちらでも構いません。

コマンド実行例

cat ファイル名 | sed s/sed/SED/g

(全ての「sed」を「SED」に置き換える)

cat ファイル名 | sed -n s/sed/SED/pg

(全ての「sed」を「SED」に置換後、置き換えた行だけを出力する)(画面3


画面3 画面3 全ての「sed」を「SED」に置換して、置き換えた行を出力した


対象とする行を指定する

 「s」コマンドが対象とする行を限定したい場合は、「s」コマンドの前に「行番号」または「/パターン/」を指定します(行番号/パターンの指定:本連載第54回を参照)。

コマンド実行例

cat ファイル名 | sed -n 2,5s/GNU/gnu/p

(2〜5行目の「GNU」を「gnu」に置換後、置き換えた行だけを出力する)

cat ファイル名 | sed -n /sed/s/GNU/gnu/p

(「sed」というパターンが含まれる行の「GNU」を「gnu」に置換後、置き換えた行だけを出力する)(画面4


画面4 画面4 「sed」が含まれる行の「GNU」を「gnu」に置換した)


1文字ずつ対応させて置換する

 パターンではなく、1文字ずつ置き換えするには「y」コマンドを使用します。例えば、「y/GNU/gnu/」と指定した場合は「GNU」という単語ではなく、「G」という文字を「g」に、「N」を「n」に、「U」を「u」に置き換えることになります。

 「a-z」のような範囲指定はできないので、置き換えたい全ての文字を指定する必要があります。単純に文字を置き換えるだけであれば、「tr」コマンドの方が手軽で便利です(trコマンド:本連載第52回を参照)。

 なお、「s」コマンドのようなフラグはなく、行中の全ての文字が置換対象となります。

コマンド実行例

cat ファイル名 | sed y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/

(大文字を小文字に置換する)

cat ファイル名 | sed y/GNU/gnu/

(「G」を「g」に、「N」を「n」に、「U」を「u」に置換する)(画面5


画面5 画面5 全ての「G」が「g」に、「N」が「n」に、「U」が「u」に置換された


筆者紹介

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

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のメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。