Hitachi

JP1 Version 11 JP1/Advanced Shell 


8.4.28 sedコマンド(テキスト中の文字列を置換する)

形式

sed[-a][-E][-n][-r][-u]コマンド入力ファイルパス名...]
sed[-a][-E][-n][-r][-u][-e コマンド]...[-f スクリプトファイルパス名]...[入力ファイルパス名...]

機能

ファイルや標準入力のテキストの文字列を置換して標準出力に出力します。

引数

-a

編集コマンドの解析エラーが発生した場合に,ファイルが作成されないようにしたり,既存ファイルが空にならないようにしたりするときに指定します。wコマンドまたはsコマンドのwフラグで指定するパターンスペース出力ファイルの作成方法を定義します。パターンスペース出力ファイルは,wコマンド,またはwフラグ指定のsコマンドが適用されるときに作成されます。-aオプションを指定しない場合は,wコマンド,またはsコマンドのwフラグ解析時にパターンスペース出力ファイルを作成します。

-E|-r

コマンドで指定するパターンを,拡張した正規表現として扱います。どちらのオプションを指定しても同じように実行されます。

-n

標準出力へのパターンスペースの出力を抑止します。pコマンドまたはPコマンドによる出力以外はパターンスペースの標準出力への出力は行いません。

-u

Windowsの場合,標準出力への実行結果出力時のバッファリングを抑止します。

UNIXの場合,標準出力への実行結果出力時のバッファリングをレコード単位にします。

コマンド|-e コマンド

入力ファイルを編集するコマンドを指定します。-eオプションは複数指定できます。-eオプションを複数指定する場合,コマンドの実行順序は指定された順番です。-fオプションを指定しない場合は,-eオプションの指定を省略できます。

-f スクリプトファイルパス名

スクリプトファイルのパス名を指定します。スクリプトファイルには,入力ファイルのレコードを編集する編集コマンドを記述します。-fオプションは複数指定できます。-fオプションを複数指定する場合,または-eオプションと組み合わせて指定する場合,コマンドの実行順序は指定された順番です。

入力ファイルパス名

編集する入力ファイルのパス名を指定します。複数指定できます。パス名を指定しない場合は,標準入力から入力します。ファイルを複数指定した場合,処理中のファイルが終端に到達したときに次のファイルをオープンしてレコードを入力します。

編集コマンドの記述形式

入力ファイルを編集する編集コマンドの記述形式を次に示します。

address[,address]]commandarguments

addressには,編集対象のレコードを特定するためのアドレス(レコードの行番号,または検索パターン文字列)を指定します。

commandには,入力レコードに適用する編集コマンドを指定します。

argumentsには,編集コマンドに渡す引数を指定します。

入力ファイルから1レコードを入力するたびにアドレスで指定したレコードの行番号,または検索パターン文字列と比較し,一致した場合に編集コマンドが実行されます。アドレスを省略した場合はすべてのレコードが編集の対象となります。編集コマンドの実行結果は標準出力に出力されます。

アドレス

入力ファイル内の編集対象となるレコードを特定するためのアドレスです。

パターンスペースとホールドスペース

sedコマンドにはパターンスペース,ホールドスペースと呼ばれるテキスト編集用の作業領域があります。

パターンスペースには入力ファイルから入力したレコードが格納されます。

パターンスペースは,次に示すsedコマンドの処理の流れで使用されます。

  1. 入力ファイルから改行コードで分割された1レコードを入力します。

    Windowsでは,[CR]+[LF]または[LF]です。UNIXでは,[LF]だけです。UNIXの場合,入力ファイルの改行コードが[CR]+[LF]のときは,パターンスペースに[CR]が格納されます。

  2. 入力レコードの内容をパターンスペースにコピーします。

  3. パターンスペースがアドレスで指定した行番号,またはパターンスペースの内容に検索パターン文字列が一致する場合に編集コマンドを実行します。

    実行するコマンドがDコマンドの場合に,Dコマンド実行後にパターンスペースの内容が残っているときは,手順1と手順2は処理されません。

  4. パターンスペースの内容を標準出力に出力します。

    ただし,-nオプションが指定されている場合は処理されません。

  5. パターンスペースの内容を消去します。

ホールドスペースはパターンスペースの内容を退避したり,ホールドスペースの内容をパターンスペースに戻したりする一時的な作業領域として使用できます。

編集コマンド

sedコマンドで使用できる編集コマンドを次に示します。

[address[,address]]{command-list}

入力レコードに適用する複数の編集コマンドをグループ化します。各編集コマンドは改行または;(セミコロン)で区切ります。なお,最後に記述した編集コマンドと同じ行に「}」を記述する場合は,コマンド名の後ろに「;」を記述する必要があります。

[address]a\(改行)

text

次の入力レコードを読み込む前にtextに記述したテキストを標準出力に出力します。複数レコードを出力する場合は,改行の直前に「\」を記述します。

指定例を次に示します。次の入力レコードを読み込む前に2レコードを標準出力に出力します。

a\(改行)
テキスト1\(改行)
テキスト2
[address[,address]]b[label]

指定したラベルlabelが定義されている「:label」コマンドに分岐します。labelの指定を省略した場合は,スクリプト記述の末尾に分岐します。

[address[,address]]c\(改行)

text

パターンスペースの内容を削除します。アドレス未指定または1個のアドレスが指定されている場合は,textに記述したテキストを標準出力に出力します。アドレス2個指定の場合は,選択された範囲の最終レコードを処理したあとにtextに記述したテキストを標準出力に出力します。複数レコードを出力する場合は,改行の直前に「\」を記述します。

また,cコマンドの後ろに記述されているコマンドは実行されないで,次の入力レコードを読み込んで先頭のコマンドから実行が開始されます。

[address[,address]]d

パターンスペースの内容を削除します。削除するパターンスペースの内容は標準出力には出力されません。また,dコマンドの後ろに記述されているコマンドは実行されないで,次の入力レコードを読み込んで先頭のコマンドから実行が開始されます。

[address[,address]]D

パターンスペースに複数レコードが格納されている場合に,最初の改行までを削除します。パターンスペースの内容は標準出力には出力されません。また,Dコマンドの後ろに記述されているコマンドは実行されないで,先頭のコマンドから実行が開始されます。

Dコマンドを実行した結果,パターンスペースの内容がなくなった場合は,次の入力レコードを読み込んで先頭のコマンドから実行が開始されます。

[address[,address]]g

ホールドスペースの内容をパターンスペースにコピーします。コピー前のパターンスペースの内容は破棄されます。

[address[,address]]G

ホールドスペースの内容をパターンスペースに追加します。追加前にパターンスペースに格納されているレコードとは改行文字で区切られます。

[address[,address]]h

パターンスペースの内容をホールドスペースにコピーします。コピー前のホールドスペースの内容は破棄されます。

[address[,address]]H

パターンスペースの内容をホールドスペースに追加します。追加前にホールドスペースに格納されているレコードとは改行文字で区切られます。

[address]i\(改行)

text

現在の入力レコードをパターンスペースに格納する前にtextに記述したテキストを標準出力に出力します。複数レコードを出力する場合は,改行の直前に「\」を記述します。

[address[,address]]l

パターンスペースの内容を標準出力に出力します。1バイト文字(0x20〜0x7eの範囲),スペースおよびマルチバイト文字以外のデータは,各バイトごとに「\」に続いて3桁の8進数で出力します。また,「\」は「\\」として出力され,次の表に示す制御コードはエスケープ文字として出力されます。

制御コード

出力されるエスケープ文字

アラート文字(ベル)

\a

バックスペース文字

\b

フォームフィード文字(改ページ)

\f

改行文字。なお,行(複数行の場合は最終行)の終端の改行文字は出力されません。

\n

復帰文字

\r

タブ文字

\t

垂直タブ文字

\v

1レコードの出力幅は,次の優先順位で値が決まります。

  1. 環境変数COLUMNSの値

  2. コンソールへの出力の場合はコンソール画面の幅

  3. 半角文字で60文字

各レコードの終わりには$記号が出力されます。なお,1レコードが出力幅を超える場合は折り返して出力されます。折り返し部分には「\」が出力されます。

[address[,address]]n

入力ファイルから次の入力レコードを読み込んでパターンスペースに格納し,現在の内容を標準出力に出力します。現在の行番号には1が加算されます。-nオプション指定時は,パターンスペースの現在の内容は標準出力に出力されません。

[address[,address]]N

入力ファイルから次の入力レコードを読み込んでパターンスペースに追加します。追加前にパターンスペースに格納されているレコードとは改行文字で区切られます。現在の行番号には1が加算されます。

[address[,address]]p

パターンスペースの内容を標準出力に出力します。

[address[,address]]P

パターンスペースに複数レコードが格納されている場合に,最初の改行までの内容を出力します。パターンスペースに1レコードしか格納されていない場合はpコマンドの場合と同じです。

[address]q

スクリプトの処理を終了します。この記述以降はコマンドの実行および入力レコードの入力はしません。-nオプションが指定されていない場合,終了時にパターンスペースの内容を標準出力に出力します。また,aまたはrコマンドで追加されたレコードがあるときはそのレコードが出力されます。

[address]r パス名

次の入力レコードの入力前にパス名で指定したファイルの内容を標準出力に出力します。パス名で指定したファイルの入力でエラーが発生しても無視されます。

Windowsの場合,ファイル中の改行コードは[CR]+[LF]で出力されます。

UNIXの場合,ファイル中の改行コードをそのまま出力します。

[address[,address]]s/pattern/replacement/flags

パターンスペース内のパターンpatternに最初に一致する文字列を置き換え文字列replacementに置き換えます。「s」,patternおよびreplacementの区切り文字である「/」を,「\」と改行文字以外のすべての1バイト文字のどれかに変更できます。区切り文字をpattern,replacementの文字に含めたい場合は,pattern,replacement内の区切り文字の前に「\」を記述します。

パターンには正規表現が指定できます。

また,置き換え文字列replacementには次の文字が指定できます。

  • 「&」を指定した場合は,「&」がパターンに一致した文字列に置き換わります。「&」を置き換える文字として扱いたい場合は「&」の前に「\」を記述します。

  • \N」(N:1〜9の数字)を指定した場合は,「\N」がパターンの()(丸括弧)で囲まれたタグ付き正規表現に一致する文字列に置き換わります。「\」の後ろの数字はパターン中のタグ付き正規表現文字列の順番を示します。

  • 改行を含める場合は改行の直前に「\」を記述します。

flagsに指定できるフラグには次の値があります。なお,フラグは省略でき,また1個以上指定できます。

N

パターンスペースでN回目に一致したパターンだけを置き換えます。

g

パターンスペースの最初にパターンに一致した文字列の置き換えだけでなく,パターンスペース内のパターンに一致したすべての文字列を置き換えます。

p

置き換えを実行した場合,置き換え後のパターンスペースの内容を標準出力に出力します。

w パス名

置き換えを実行した場合,置き換え後のパターンスペースの内容をパス名で指定したファイルに追加します。指定したファイルがある場合は,次のようになります。

・-aオプションを指定しないとき

置き換えの有無に関係なくsedコマンド実行前の内容は破棄されます。

・-aオプションを指定するとき

置き換えが実行されるとsedコマンド実行前の内容は破棄されます。

Windowsの場合,ファイルに出力される改行コードは[CR]+[LF]で出力されます。

[address[,address]]t[label]

入力レコードが読み込まれてから,または直前に実行されたtコマンド以降でsコマンドによる置き換えが行われた場合に,指定したラベルlabelが定義されている:(コロン)コマンドに分岐します。labelの指定を省略した場合は,スクリプト記述の末尾に分岐します。

[address[,address]]w パス名

パターンスペースの内容をパス名で指定したファイルに追加します。指定したファイルがある場合は,次のようになります。

  • -aオプションを指定しないとき

    アドレスaddressが一致しているかどうかに関係なくsedコマンド実行前の内容は破棄されます。

  • -aオプションを指定するとき

    アドレスaddressに一致するとsedコマンド実行前の内容は破棄されます。

Windowsの場合,ファイルに出力される改行コードは[CR]+[LF]で出力されます。

[address[,address]]x

パターンスペースの内容とホールドスペースの内容を交換します。

[address[,address]]y/string1/string2/

パターンスペースの内容に対して,文字列string1に指定した文字ごとに検索と置き換えを行います。置き換える文字は,文字列string1の各文字に対応する位置にある文字列string2中の文字で置き換えます。

string1とstring2の文字数は同じにする必要があります。

string1またはstring2に改行文字を指定する場合は\nを指定します。「y」,string1およびstring2の区切り文字である「/」を,「\」と改行文字以外のすべての1バイト文字のどれかに変更できます。

[address[,address]]!commandまたは[address[,address]]!{command-list}

コマンドまたは,グループ化したコマンド群をアドレスaddressで選択されないレコードに適用します。

:label

bおよびtコマンドに指定した分岐先のラベルを定義します。:(コロン)コマンド自体は処理をしません。

[address]=

現在の行番号を1レコードとして標準出力に出力します。

(空行)

空行は無視されます。

#

#以降はコメントとして扱われます。なお,スクリプトファイルの先頭レコードの1カラム目に「#n」を記述した場合は,-nオプションを指定した場合の動作となります。

エスケープ文字

アドレスの検索パターン,aコマンドのテキスト,cコマンドのテキスト,iコマンドのテキスト,sコマンドのパターンと置き換え文字列,およびyコマンドの検索文字と置き換え文字には次のエスケープ文字を使用できます。

エスケープ文字

意味

\a

アラート文字(ベル)

\b

バックスペース文字※1

\f

フォームフィード文字(改ページ)

\n

改行文字※2

\r

復帰文字

\t

タブ文字

\v

垂直タブ文字

\xhex

1〜2桁の16進値で表された文字(0〜9,a〜f,A〜F)※3

\c

任意のリテラル文字(「\"」なら「"」)

\\

1つのバックスラッシュ文字

注※1

アドレスの検索パターン,sコマンドのパターンに指定した場合,正規表現演算子の\bとして扱われます。なお,[ ]で囲んだ文字集合内に指定した場合はバックスペース文字として扱われます。

注※2

Windowsの場合,aコマンドのテキスト,cコマンドのテキストおよびiコマンドのテキストで指定すると,出力時に[CR]+[LF]で出力されます。

注※3

パターンに指定する場合,実行時の文字コード種別によっては指定できない値があります。文字コード種別ごとに指定できる値を16進数値で示します。なお,次の値以外を指定した場合はエラー終了します。

・文字コード種別:シフトJIS

 0x01-0x80,0xA0-0xDF,0xFD-0xFF

・文字コード種別:UTF-8

 0x01-0xBF,0xFE-0xFF

・文字コード種別:EUC

 0x01-0x8D,0x90-0xA0,0xFF

・文字コード種別:C

 0x01-0xFF

終了コード

終了コード

意味

0

正常終了

1以上

エラー終了

使用例