テキストの置換処理を得意とするスクリプト言語

sed

sed は、テキストの置換処理を行う目的で作られたスクリプト言語である。ほとんどの場合、1 行のスクリプトを記述だけで、テキストの置換などをはじめとして、後方参照を利用した置換などの複雑な処理も可能である。インターネットで one-liners for sed などと検索する、様々な処理を 1 行の sed スクリプトで行う例を多く見つけることができる。

文字列置換

sed コマンドを利用して、文字列の置換を行うとき、sed コマンドに続いて -e オプションを付けて、その後ろに置換パターンなどを書く。

基本的な置換方法

例えば、sample.fa ファイル中の、各行に出現する最初の TAG を * に置換する場合は以下のようにする。

sed -e 's/TAG/*/' sample.fa

各行に出現するすべての TAG を * に置換する場合は以下のように g を付け加える。

sed -e 's/TAG/*/g' sample.fa

また、次のように、各行に出現する 3 番目 TAG だけを * に置換する場合もできる。

sed -e 's/TAG/*/g' sample.fa

大文字と小文字を区別しない場合は i オプションを付け加える。

sed -e 's/TAG/*/gi' sample.fa

複数の置換を連続して行う場合は、複数のパターンを同時に書く。この場合、1 番目の置換が終わってから、2 番目の置換が行われる。そのため、次の例では、まずすべての行にある TAG を TAA に置換してから、次に TAA を * に置換している。

sed -e 's/TAG/TAA/g' -e 's/TAA/*/' sample.fa

正規表現を利用した置換方法

置換条件のところに正規表現を利用することができる。この場合、オプションとして -E をつける。例えば、以下のようにすると、各行に出現するすべての TAG、TAA および TGC を * に置換することができる。

sed -E 's/[TAG|TAA|TGC]/*/g' sample.fa

条件付きの文字列置換

すべての行ではなく、特定の行に対してのみ置換を行うことも可能である。この場合、置換パターンの直前に、その条件を正規表現あるいは sed 特有の書き方で付け加えればよい。

特定の文字列を含む行に対して置換

例えば、ファイルの中の「>」で始まる行に対して、文字 NN を NM に置換するには以下のように /^>/ を置換パターンの前に加える。

sed -E '/^>/s/NN/NM/g' sample.fa

特定の文字列を含まない行に対して置換

逆に、ファイルの中の「>」で始まる行以外の行に対して、文字 TAG を * に置換するには以下のようにする。

sed -E '/^>/!s/TAG/*/g' sample.fa

行を指定して置換

特定の行に対してのみ置換を行う場合は、置換パターンの前にその行番号を指定する。例えば、3 行目のみに対して、置換を行う場合は以下のようにする。

sed -e '3s/TAG/*/g' sample.fa

また、行の範囲を指定することも可能である。例えば、3 行目から 6 行目までの行のみに対して、置換を行う場合は以下のようにする。

sed -e '3,6s/TAG/*/g' sample.fa

3 行目以外の行に対して、置換を行う場合は以下のようにする。

sed -e '3!s/TAG/*/g' sample.fa

また、3 行目から 6 行目までの行以外の行に対して、置換を行う場合は次のようにする。

sed -e '3,6!s/TAG/*/g' sample.fa

指定したパターンに囲まれた行に対して置換

例えば、begin 文字列を含む行から end を含む行までの間の行に対して、GC を CG に置換を行う場合は、以下のように範囲を指定する。

sed -e '/begin/,/end/ s/GC/CG/g' sample.fa

この条件も逆転させることができ、つまり begin 文字列を含む行から end を含む行までの間の行以外の行に対して、置換を行う場合には次のようにする。

sed -e '/begin/,/end/ !s/GC/CG/g' sample.fa

後方参照

sed は後方参照をサポートしている。テキストがあるパターンにマッチングした部分を、あとで利用することができる。例えば、「>NM000001」のようなパターンを「>NM_000001」に置換する場合では、まず「>NM」と「NM000001」を覚えておき、次に、この部分を置換する際に、覚えた文字列を再び呼び出して、修正してから置換を行うことができる。

sed -E 's/^>¥([A-Z]\{2\}¥)/\1_/g' sample.fa

この場合、後方参照したい部分を \(\) で囲み、参照は \1\2 などのように行う。(\ はフォントの種類によって、バックスラッシュに見えたり、円マークに見えたりする。)

アドレスコマンド

sed で利用するアドレスコマンドとその意味。

オプション意味
dその行を出力しない
pその行を出力する、-n をつけると変換前のものは出力しない
s置換
y一文字ずつ置換
q終了

メタ文字

sed の正規表現に利用できるメタ文字。いくつかのメタ文字(「\+」や「\(」など)は、エスケープして使う必要がある。

grepsedawk意味
...任意の 1 文字
***直前の 1 文字または 1 パターンの 0 回以上の繰り返し
^^^行の先頭
$$$行の末尾
\( \)\( \)( )パターンのグループ化
\1 \2 \3\1 \2 \3後方参照
[ ][ ][ ]括弧内の任意の 1 文字
\{n, m\}\{n, \}{n, m}直前の 1 文字または 1 パターンの n 回以上かつ m 回以下の繰り返し
\{n, \}\{n, \}{n, }直前の 1 文字または 1 パターンの n 回以上の繰り返し
\{n\}\{n\}{n}直前の 1 文字または 1 パターンの n 回の繰り返し
\+\++直前の 1 文字あるいは 1 パターンの 1 回以上の繰り返し
\??直前の 1 文字あるいは 1 パターンの 0 回または 1 回だけ出現
\|\||2 パターンのうちどちら片方