Go to main content

マニュアルページ セクション 1: ユーザーコマンド

印刷ビューの終了

更新: 2018年8月8日
 
 

sed(1)

名前

sed - ストリームエディタ

形式

/usr/bin/sed [-n] script [file]...
/usr/bin/sed [-n] [-e script]... [-f script_file]... [file]...
/usr/xpg4/bin/sed [-n] script [file]...
/usr/xpg4/bin/sed [-n] [-e script]... [-f script_file]... [file]...

説明

sed ユーティリティーは、テキストファイルを読み込み、編集コマンドのスクリプトに従って内容を編集し、結果を標準出力に書き出すストリームエディタです。スクリプトは、script オペランド文字列か、–e script–f script_file のオプション引数の組み合わせで指定します。

sed ユーティリティーはテキストエディタですが、バイナリファイルや、ASCII NUL (\0) 文字を含んだファイル、長い行を含んだファイルは編集できません。

オプション

サポートしているオプションは、次のとおりです。

–e script

script は、sed の編集コマンドです。script のフォーマットの詳細については、「使用法」を参照してください。–e オプションを 1 つだけ指定し、–f オプションを指定しない場合、フラグ –e は省略できます。

–f script_file

script_file に指定したファイルからスクリプトを読み取ります。このファイルの各行には、編集コマンドが 1 つずつ記述されています。

–n

デフォルトの出力を抑止します。

–e–f の両オプションは、それぞれ複数個指定できます。コマンドはすべて、どのオプションで指定されたかに関係なく、指定の順序でスクリプトに追加されます。

オペランド

次のオペランドがサポートされています。

file

内容を読み込んで編集するファイルのパス名。file オペランドを複数個指定すると、指定した順序で読み込まれ、連結されたファイルを編集することになります。file を指定しないと、標準入力が読み込まれます。

script

編集コマンドのスクリプトとして使用する文字列。アプリケーション側で、テキストファイルの規約に反するような script を指定することはできませんが、文字列の最後の文字が復帰改行文字でなくてもかまいません。

使用法

スクリプトは、複数の編集コマンドで構成されます。スクリプト内の各行に、編集コマンドを 1 つずつ記述します。次のような書式を使用します。

[ address [ , address ] ] command [ arguments ]

最初のアドレス (address) の前と、コマンド (command) の前には、任意の数の空白文字を入力できます。また、最初のアドレスの前には、任意の数のセミコロンも入力できます。

通常、sed は、次の動作を繰り返します。まず、D コマンドの実行後に何も残っていないことを確認し、入力行の 1 行を「パターンスペース」にコピーします。このとき、行末の復帰改行文字は含まれません。さらに、このパターンスペースを選択するアドレスを持つコマンドがあれば、そのコマンドをすべてパターンスペースに適用します。次に、その結果を標準出力にコピーし、パターンスペースを削除します。ただし、–n が指定されているときは、この処理は行いません。このようにしてパターンスペースを標準出力または指定ファイルに書き出すたびに、sed はその後に復帰改行文字を付け加えます。

コマンドのいくつかは、以前に取り出したパターンスペースを取り出しやすくするために、その一部または全部を「ホールドスペース」に保存します。パターンスペースとホールドスペースには、それぞれ最大 8192 バイトのデータを記録できます。

sed のアドレス

address には、10 進数 (すべてのファイルの入力行を累積的にカウントする)、$ (入力の最終行をアドレス指定する)、コンテキストアドレスのほか、空 (区切りのみ) を指定できます。address は、regexp(7) のマニュアルページで解説しているように、スラッシュで囲んだ正規表現 (/regular expression/) で構成されます。

アドレスのないコマンド行は、すべてのパターンスペースを選択します。

アドレスを 1 つ持つコマンド行は、そのアドレスと一致するパターンスペースを選択します。

アドレスを 2 つ持つコマンド行は、1 つめのアドレスと一致する最初のパターンスペースから 2 つめのアドレスと一致する次のパターンスペースまでの範囲を選択します。その後プロセスが繰り返され、ふたたび 1 つ目のアドレスを探します。 (2 つめのアドレスが、1 つめのアドレスで選択した行番号以下の場合、1 つめのアドレスに対応する行だけが選択されます)。

通常、アドレスとアドレスの間はコンマ (,) で区切りますが、セミコロン (;) を使うこともできます。

sed の正規表現

sed は、regexp(7) のマニュアルページで説明されている正規表現のほか、次の指定をサポートしています。

\cREc

コンテキストアドレスでは、\cREc は /RE/ と同じ意味になります (c はバックスラッシュと復帰改行文字を除く任意の文字。RE は正規表現)。c に指定した文字がバックスラッシュの直後に現れた場合、これは正規表現の終了文字ではなく、リテラル文字と見なされます。たとえば、\xabc\xdefx というコンテキストアドレスでは、2 つめの x はリテラル文字 x です。この場合、正規表現は abcxdef になります。

\n

エスケープシーケンス \n は、パターンスペースに埋め込まれた復帰改行文字と一致します。コンテキストアドレスの正規表現内や置換コマンド内では、復帰改行文字をリテラル文字として処理できません。

否定コマンド ! を使用すると、編集コマンドは、選択されていないパターンスペースに適用されます ( 下記参照)。

sed の編集コマンド

以下の表に、各機能に指定できるアドレスの最大数を一覧します。

r コマンドと w コマンドには、それぞれ rfilewfile という任意指定のパラメータがあります。コマンド文字とパラメータの間は、1 つ以上の空白文字で区切ります。

複数のコマンドをセミコロン (;) で区切って、1 つのコマンド行に記述できます。

引数 text は、行で構成されます。この引数が複数の行で構成されている場合、最終行以外のすべての行は \ で終了し、復帰改行をエスケープします。復帰改行文字をテキストに埋め込む場合は、その前にバックスラッシュを付加してください。テキストに埋め込まれたその他のバックスラッシュは削除され、その直後の文字がリテラル文字として処理されます。つまり、テキストに埋め込まれたバックスラッシュは、s コマンドの置換文字列中のバックスラッシュと同様に処理されることになります。また、バックスラッシュを使用して、スクリプト行の行頭の空白文字やタブ文字が削除されるのを防ぐこともできます。rfile 引数や wfile 引数は、その前に空白文字を 1 つ入力して、コマンド行の末尾に置いてください。wfile パラメータを指定すると、そのファイルが作成されます。すでにファイルが存在していれば、その内容が書き換えられます。最大 10 個の wfile 引数を指定できます。

正規表現のマッチングは、行単位ではなく、文字列全体で行われます。ただし、sed の正規表現では、復帰改行文字は \n と一致します。このため、正規表現内では復帰改行文字は使用できません。また、入力行末尾の復帰改行文字のマッチングに、\n は使用できません。パターンスペースには、復帰改行文字は編集コマンド N の結果として現れます。

コマンドのうち 2 つは command-list の形式をとります。これは復帰改行で区切られたいくつかのコマンドの集まりです。以下にその形式を示します。

{ command 
command 
}

{ の前後にはスペース文字を置くことができます。また、command の前にもスペースを置くことができます。終端の } の前には NEWLINE 文字を置く必要があり、<blank> を前後に置くことができます。さらに、中括弧の前後にも空白文字を置くことができます。コマンドの前にも空白文字を置くことができますが、後には置けません。

次の表に、機能と、許容されるアドレスの最大数を一覧表示します。

最大アドレス数
コマンド
説明
1
a\ text
N コマンド実行または新サイクル開始による追加。次の入力行を読み取る前に text を出力します。
2
b label
label を持つ : コマンドに分岐します。label が空の場合は、スクリプトの最後に分岐します。ラベルは最大 8 文字が一意であると認識されます。
2
c\ text
変更。パターンスペースを削除します。text を出力します。次のサイクルを起動します
2
d
パターンスペースを削除します。次のサイクルを起動します
2
D
パターンスペースの先頭セグメントから最初の復帰改行までを削除します。次のサイクルを起動します (下記の N コマンドを参照) 。
2
g
パターンスペースの内容をホールドスペースの内容で置換します。
2
G
ホールドスペースの内容をパターンスペースに追加します。
2
h
ホールドスペースの内容をパターンスペースの内容で置換します。
2
H
パターンスペースの内容をホールドスペースに追加します。
1
i\ text
挿入。text を標準出力に出力します。
2
l
/usr/bin/sed: 明白な形式でパターンスペースを標準出力に一覧表示します。非印字文字は 8 進数表記法で表示されます。長い行は複数行に分けて表示されます。
/usr/xpg4/bin/sed: 明白な形式でパターンスペースを標準出力に一覧表示します。非印字文字は 8 進数表記法で表示されます。長い行は複数行に分けて表示されます。文字 \\\a\b\f\r\t\v が対応するエスケープシーケンスとして出力されます。テーブル中にない非印字文字に関しては、各バイトごと (最上位ビットから) に 3 桁の 8 進数で、前にバックスラッシュが付加された形式で出力されます。1 バイトが 10 ビット以上のシステムでは、非印字文字のフォーマットは導入先により異なります。
長い行は折り返され、折り返しの発生地点はバックスラッシュと復帰改行文字によって示されます。折り返し地点の長さは不特定ですが、出力装置に適した値になっています。各行の終わりは $ でマークされます。
2
n
デフォルト出力が抑止されていなければ、パターンスペースを標準出力にコピーします。パターンスペースを入力の次の行で置換します。
2
N
入力の次の行をパターンスペースに追加し、復帰改行文字を埋め込みます。(現在の行番号が変わります) 。入力に次の行がなければ、N コマンド動詞はスクリプトの終わりに分岐し、新たなサイクルを開始せずに、パターンスペースを書き出さずに終了します。
2
p
出力。パターンスペースを標準出力にコピーします。
2
P
パターンスペースの先頭セグメントから最初の復帰改行までを標準出力にコピーします。
1
q
終了。スクリプトの最後に分岐します。新しいサイクルを起動しません。
2
r rfile
rfile の内容を読み取ります。次の入力行を読み取る前にこの内容を出力します。rfile が存在しないまたは読み取れないときは、エラーとはならず、あたかも空のファイルであるかのように扱われます。
2
t label
テスト。入力行の最新の読み取りまたは t の実行以降に代入が行われている場合は、label を持つ : コマンドに分岐します。label が空の場合は、スクリプトの最後に分岐します。
2
w wfile
書き込み。wfile にパターンスペースを追加します。最初の w が発生すると、wfile がクリアされます。後続の w が呼び出されると、追加されます。sed コマンドが使用されるごとに、wfile が上書きされます。
2
x
パターンスペースおよびホールドスペースの内容を交換します。
2
! command
否定。アドレスによって選択されなかった行だけに、command (または、command{ の場合はグループ) を適用します。
0
: label
このコマンドは何もしません。これは分岐するための b および t コマンド用の label を持っています。
1
=
現在の行番号を 1 行として標準出力します。
2
{command-list}
パターンスペースが選択された場合のみ、command-list を実行します。
0
空のコマンドは無視されます。
0
#
スクリプトファイルの行の先頭文字が # の場合、その行全体が注釈行として扱われます。 ただし、先頭行に # があり、# の後の文字が n の場合は唯一の例外で、デフォルトの出力が抑止されます。#n の後の残りの行も無視されます。スクリプトファイルには 1 つ以上の非注釈行が必要です。
最大アドレス数
コマンド (strings を使用) と説明
2
s/regular expression/replacement/flags
パターンスペース内の regular expression に一致する文字列を replacement に置換します。正規表現 (regular expression) と置換文字列 (replacement) を区切るのに、スラッシュの代わりに、バックスラッシュと復帰改行以外の任意の文字を使用できます。正規表現および置換文字列内で、区切り文字を文字列の一部として使用したければ、前にバックスラッシュを付加してください。
置換文字列中のアンパサンド (&) は、正規表現に一致する文字列に置き換えられます。この & が持つ特殊な意味は、前にバックスラッシュを付加すれば無効にできます。n の前にバックスラッシュを付加した \n は、対応する後方参照表現と一致するテキストに置き換えられます。replacement を先頭から終端まで走査する際にバックスラッシュ (\) が検出されると、後続の文字は特殊な意味を持っていたとしてもその意味を失います。&、\、数字以外の文字にそれぞれどのような特殊な意味が与えられるかは、不特定です。
行は、その中に復帰改行文字を使用することによって分割できます。アプリケーションは、replacement 内の復帰改行文字の前にバックスラッシュを置くことによって、これをエスケープする必要があります。置換文字列が、置換後の文字列と同一である場合も、置換が行われたことになります。
flags には以下のものを、0 個以上指定できます。
n n= 1 - 512。regular expressionn 番目の発生を置換します。
g グローバル。regular expression の最初に一致したものだけでなく、重ならないすべての例を置換します。gn の両方を指定した場合、結果は不確定です。
p 置換が行われた場合、パターンスペースを出力します。
P パターンスペースの先頭セグメントから最初の復帰改行までを、標準出力にコピーします。
w wfile 書き込み。置換が行われた場合は、wfile にパターンスペースを追加します。最初の w が発生すると、wfile がクリアされます。後続の w が呼び出されると、追加されます。sed コマンドが使用されるごとに、wfile が上書きされます。
2
y/ string1 / string2 /
変形。string1 にあるすべての文字を string2 の対応する文字と交換します。string1string2 の文字は同じ数でなければなりません。string1 中に同じ文字が複数回現れた場合の結果は定義されていません。2 つの文字列を区切るのに、スラッシュの代わりに、バックスラッシュと復帰改行以外の任意の文字を使用できます。string1string2 内で、区切り文字を文字列の一部として使用したければ、前にバックスラッシュを付加してください。たとえば、y/abc/ABC/は、a を A で、b を B で、および c を C で置き換えます。

使用例 1 sed スクリプトの例

以下に示す sed スクリプトは、BSD cat –s コマンドをシミュレートし、標準入力から余分な空白行を圧縮します。

sed −n '
# Write non-empty lines.
/./     {
        p
        d
        }
# Write a single empty line, then look for more empty lines.
/^$/        p
# Get next line, discard the held <newline> (empty line),
# and look for more empty lines.
:Empty
/^$/        {
        N
        s/.//
        b Empty
        }
# Write the non-empty line before going back to search
# for the first in a set of empty lines.
        p
'

環境変数

sed の実行に影響を与える次の環境変数についての詳細は、environ(7) を参照してください。LANG、LC_ALL、LC_COLLATE、LC_CTYPE、LC_MESSAGES、および NLSPATH。

終了ステータス

次の終了ステータスが返されます。

0

正常終了。

>0

エラーが発生しました。

属性

属性についての詳細は、マニュアルページの attributes(7) を参照してください。

/usr/bin/sed

属性タイプ
属性値
使用条件
system/core-os
CSI
未対応

/usr/xpg4/bin/sed

属性タイプ
属性値
使用条件
system/xopen/xcu4
CSI
有効
インタフェースの安定性
確実
標準
standards(7) を参照してください。

関連項目

awk(1), ed(1), grep(1), attributes(7), environ(7), regexp(7), standards(7)