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

Linux基本コマンドTips(53):【 sed 】コマンド(基礎編)――テキストファイルを編集する

本連載は、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 s/abc/ABC/ ファイル名」で、指定したファイル内の「abc」を「ABC」に置き換えることができます。この「s/abc/ABC/」部分が、sedのスクリプトです(※「s」の意味などは、次回以降で取り上げます)。

 「-e」「--expression」「-f」「--file」のいずれのオプションも指定されていない場合は、“最初の引数がsedスクリプトとして”、“残りの全ての引数は入力ファイル名として”扱われます。入力ファイルが指定されていない場合は、標準入力から読み込みます。

 コマンドの実行結果は標準出力に書き出されるので、結果を保存したい場合にはリダイレクトします。

コマンド実行例

cat /etc/shells | sed s/usr/USER/

sed s/usr/USER/ /etc/shells

(「/etc/shells」の中で、「usr」と書かれている場所を「USER」に置き換える)(画面1


画面1 画面1 「/etc/shells」内で「usr」を「USER」に置換した


改行コードを変換する

 Windows環境では、改行を「CR(16進数0D)」と「LF(16進数0A)」の2バイトで表しますが、Linux環境では「LF」のみです。

 Windows環境の改行コードをLinux環境用に置き換える場合は、「s/\r//」のように実行します。これは、「\r」つまり「CR」を“空文字に置き換える(削除する)”という意味になります。「¥」記号を使っているので、スクリプト全体を引用符で囲んで「sed "s/\r//" ファイル」のように指定します。

 逆に、Linux環境の改行コードをWindows環境用に置き換える場合は、「s/$/\r/」と指定します。こちらも引用符が必要です。

 置き換えで指定している「$」は行末を表しており、「s/$/\r/」で“行末に「\r」を入れる”という意味になります。Linux環境でsedを使う場合、行の区切りは「\n」なので、行末、すなわち行の区切りの前に「\r」を追加すると「\r\n」になる、という流れです。

 なお、テキストファイルの改行コードがどうなっているかは、「file」コマンドで確認できます。「LF」の場合は「text」と表示されるのに対し、「CRLF」の場合は「with CRLF line terminators」と表示されます。

コマンド実行例

sed "s/\r//" ファイル1 > ファイル2

(「ファイル1」の「CR」を除去して「ファイル2」に保存する。「ファイル1」が「CRLF」で改行されている場合は、「LF」に置換される)(画面2の赤枠部分

sed "s/$/\r/" ファイル1 > ファイル2

(「ファイル1」の行末に「CR」を追加して「ファイル2」に保存する。「ファイル1」が「LF」で改行されている場合は、「CRLF」に置換される)(画面2の青枠部分


画面2 画面2 「CRLF」で改行されていた「crlf.txt」から「CR」を除去して「lf.txt」に保存(赤枠部分)。「LF」のみになっている「lf.txt」を「CRLF」にして「crlf2.txt」に保存(青枠部分)


ファイルを直接書き換える

 「-i」オプションで、ファイルを直接処理することができます。ファイルは上書き保存されるので、バックアップファイルを作成したい場合には「-i.BAK」や「-i~」のように、「-i」に続けてバックアップ用の拡張子を指定します。

コマンド実行例

sed -i "s/\r//" ファイル1

(「ファイル1」の「CR」を除去して上書き保存する)

sed -i~ "s/\r//" ファイル1

(「ファイル1」の「CR」を除去して上書き保存するし、「ファイル1~」というバックアップファイルを作成する)(画面3


画面3 画面3 「CRLF」で改行されていた「crlf2.txt」を書き換えて「LF」のみにした。元のファイルは「crlf2.txt~」で残されている


筆者紹介

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

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