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と同じです。