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」を覚えておき、次に、この部分を置換する際に、覚えた文字列を再び呼び出して、修正してから置換を行うことができる。なお、MacOS で「\1 not defined in the RE」が表示される場合、「sed -E」の代わりに「sed -e」を用いると実行できる場合がある
sed -E 's/^>\([A-Z]\{2\}\)/>\1_/g' sample.fa
この場合、後方参照したい部分を \(
と \)
で囲み、参照は \1
や \2
などのように行う。なお、Windows の日本語環境では、バックスラッシュ \
が円マーク ¥
として表示される。
アドレスコマンド
sed で利用するアドレスコマンドとその意味。
オプション | 意味 |
d | その行を出力しない |
p | その行を出力する、-n をつけると変換前のものは出力しない |
s | 置換 |
y | 一文字ずつ置換 |
q | 終了 |
sed で利用できる正規表現
sed で利用できる正規表現。
grep | sed | awk |
. | . | . |
* | * | * |
^ | ^ | ^ |
$ | $ < | $ < |
¥( ¥) | ¥( ¥) | ( ) |
\1 \2 \3 | \1 \2 \3 | \1 \2 \3 |
[ ] | [ ] | [ ] |
¥{n, m¥} | ¥{n, m¥} | {n, m} |
¥{n, ¥} | ¥{n, ¥} | {n, } |
¥{n¥} | ¥{n¥} | {n} |
\+ | \+ | + |
\? | ? | |
\| | \| | | |