このページの内容

3.5 使用頻度の低いコマンド

前の節のコマンドほど頻繁には使わないかもしれませんが、これらを使えば、ごく短くても役立つsedスクリプトを作れます。

y/source-chars/dest-chars/

パターンスペースにある文字のうち、source-charsのいずれかに一致する文字を、対応するdest-charsの文字へ置き換えます。

例:「a-j」を「0-9」へ文字単位で置き換えます。

$ echo hello world | sed 'y/abcdefghij/0123456789/'
74llo worl3

(一つのyコマンド内では、/文字をすべて同じ別の1文字へ置き換えられます。)

source-charsやdest-charsのリストには、/(またはその代わりに使った文字)、\、改行を含められます。ただし、それぞれを\でエスケープする必要があります。source-charsとdest-charsのリストの文字数は、エスケープを解いた後に同じでなければなりません。

同様の機能については、GNU coreutilsのtrコマンドを参照してください。

a text

行の後にtextを追加します。これは標準のaコマンドへのGNU拡張です。詳細は以下を参照してください。

例:2行目の後に「hello」を追加します。

$ seq 3 | sed '2a hello'
1
2
hello
3

aコマンドの直後の空白は無視されます。追加するテキストは行末まで読み込まれます。

a\
text

行の後にtextを追加します。

例:2行目の後に「hello」を追加します(-|は表示される出力行を示します)。

$ seq 3 | sed '2a\
hello'
-|1
-|2
-|hello
-|3

aコマンドは、このコマンドの後に続くテキストの各行をキューに入れ、現在のサイクルの最後、または次の入力行を読み込むときに出力します。最後の行以外は\で終えます。これらのバックスラッシュは出力から取り除かれます。

GNU拡張として、このコマンドにはアドレスを二つ指定できます。

text内のエスケープシーケンスは処理されるので、バックスラッシュを一つ表示するには、text内に\\を使ってください。

バックスラッシュ(\)のない最後の行の後から、コマンドの処理を再開します。次の例では「world」がその行です。

$ seq 3 | sed '2a\
hello\
world
3s/./X/'
-|1
-|2
-|hello
-|world
-|X

GNU拡張として、aコマンドとtextを二つの-e引数に分けて指定でき、スクリプトを書きやすくなります。

$ seq 3 | sed -e '2a\' -e hello
1
2
hello
3

$ sed -e '2a\' -e "$VAR"
i text

行の前にtextを挿入します。これは標準のiコマンドへのGNU拡張です。詳細は以下を参照してください。

例:2行目の前に「hello」を挿入します。

$ seq 3 | sed '2i hello'
1
hello
2
3

iコマンドの直後の空白は無視されます。追加するテキストは行末まで読み込まれます。

i\
text

このコマンドの後に続くテキストの各行を、直ちに出力します。

例:2行目の前に「hello」を挿入します(-|は表示される出力行を示します)。

$ seq 3 | sed '2i\
hello'
-|1
-|hello
-|2
-|3

GNU拡張として、このコマンドにはアドレスを二つ指定できます。

text内のエスケープシーケンスは処理されるので、バックスラッシュを一つ表示するには、text内に\\を使ってください。

バックスラッシュ(\)のない最後の行の後から、コマンドの処理を再開します。次の例では「world」がその行です。

$ seq 3 | sed '2i\
hello\
world
s/./X/'
-|X
-|hello
-|world
-|X
-|X

GNU拡張として、iコマンドとtextを二つの-e引数に分けて指定でき、スクリプトを書きやすくなります。

$ seq 3 | sed -e '2i\' -e hello
1
hello
2
3

$ sed -e '2i\' -e "$VAR"
c text

行をtextに置き換えます。これは標準のcコマンドへのGNU拡張です。詳細は以下を参照してください。

例:2〜9行目を単語「hello」に置き換えます。

$ seq 10 | sed '2,9c hello'
1
hello
10

cコマンドの直後の空白は無視されます。追加するテキストは行末まで読み込まれます。

c\
text

アドレスまたはアドレス範囲に一致する行を削除し、このコマンドの後に続くテキストの各行を出力します。

例:2〜4行目を単語「hello」と「world」に置き換えます(-|は表示される出力行を示します)。

$ seq 5 | sed '2,4c\
hello\
world'
-|1
-|hello
-|world
-|5

アドレスを指定しなければ、各行を置き換えます。

このコマンドの処理後は、パターンスペースが削除されているため、新しいサイクルを開始します。次の例では、cが新しいサイクルを開始し、置き換えたテキストに置換コマンドは適用されません。

$ seq 3 | sed '2c\
hello
s/./X/'
-|X
-|hello
-|X

GNU拡張として、cコマンドとtextを二つの-e引数に分けて指定でき、スクリプトを書きやすくなります。

$ seq 3 | sed -e '2c\' -e hello
1
hello
3

$ sed -e '2c\' -e "$VAR"
=

現在の入力行番号を、末尾の改行とともに表示します。

$ printf '%s\n' aaa bbb ccc | sed =
1
aaa
2
bbb
3
ccc

GNU拡張として、このコマンドにはアドレスを二つ指定できます。

l n

パターンスペースを曖昧さのない形式で表示します。表示不能文字と\文字はC形式のエスケープ表記で表示し、長い行は分割して、その末尾の\文字で分割を示します。各行の末尾は$で示します。

nは折り返し幅を指定します。0(ゼロ)は長い行を折り返さないことを意味します。省略すると、コマンドラインで指定した既定値を使います。引数nはGNU sed拡張です。

r filename

ファイルfilenameを読み込みます。例:

$ seq 3 | sed '2r/etc/hostname'
1
2
fencepost.gnu.org
3

filenameの内容を読み込み待ちのキューに入れ、現在のサイクルの最後、または次の入力行を読み込むときに、出力ストリームへ挿入します。filenameを読めなければ、エラーを通知せず、空のファイルであるかのように扱います。

GNU sed拡張として、ファイル名には特殊な値/dev/stdinを指定でき、標準入力の内容を読み込みます。

GNU拡張として、このコマンドにはアドレスを二つ指定できます。その場合、アドレスで選ばれた各行で、ファイルを再度読み込んで挿入します。

GNU sed拡張として、rコマンドにはアドレス0を指定でき、入力の最初の行の前にファイルを挿入します。複数ファイルへのヘッダー追加を参照してください。

w filename

パターンスペースをfilenameへ書き込みます。GNU sed拡張として、filenameには二つの特殊な値を指定できます。/dev/stderrは結果を標準エラー出力へ、/dev/stdoutは標準出力へ書き込みます4。

最初の入力行を読み込む前に、ファイルを作成するか、既存ファイルを切り詰めます。同じfilenameを参照するすべてのwコマンド(置換が成功したsコマンドのwフラグも含みます)は、ファイルを閉じて開き直すことなく出力します。

D

パターンスペースに改行がなければ、dコマンドを実行した場合と同じように、通常の新しいサイクルを開始します。それ以外の場合は、最初の改行までのテキストを削除し、残ったパターンスペースを使ってサイクルを再開します。新しい入力行は読み込みません。

N

パターンスペースに改行を追加し、その後に次の入力行を追加します。入力がもうなければ、sedは残りのコマンドを処理せず終了します。

-zを使う場合は、改行の代わりにゼロバイト(ASCIIの「NUL」文字)を行の間に追加します。

既定では、sedは「次の」入力行がなくても終了しません。これはGNU拡張で、--posixで無効にできます。最終行でのNコマンドを参照してください。

P

パターンスペースの最初の改行までの部分を表示します。

h

ホールドスペースの内容をパターンスペースの内容で置き換えます。

H

ホールドスペースの内容に改行を追加し、その後にパターンスペースの内容を追加します。

g

パターンスペースの内容をホールドスペースの内容で置き換えます。

G

パターンスペースの内容に改行を追加し、その後にホールドスペースの内容を追加します。

x

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


(4)

-iオプションを使っている場合を除き、pと同じです。