sed コマンド 置換・削除・アドレッシングまとめ

バイオインフォ道場、くまぞうです。

sedはとても便利なツールです。よく使うコマンドやアドレシング・否定の指定方法など、ちょっとしたテクニックも知っておくと便利です。

スポンサーリンク



よく使うsedコマンド

置換や削除はよく使います。その他にも、特定の行だけの処理・パターンを除外した処理などできます。

hello.sh(サンプルとして使います)

#! /bin/bash

for i in `seq 1 ${1}`; do
    echo "${i} hello! 123"
done

置換

置換を行う際はsコマンドを使います。更に、複数実行する場合は-eオプションを使います。マッチしたパターン全て(または指定部位)に処理を適用したい場合は、gフラグ(または数字)を使います。

コマンドで確認

$ echo "hello world!" | sed 's/hello/HELLO/'  # 文字列を指定
HELLO world!

$ echo "hello world!" | sed 's/\W/-/g'        # 文字列クラス(\W)を指定(全体)
hello-world-

$ echo "hello world!" | sed 's/\W/-/2'        # パターンマッチの2番目だけを処理
hello world-

削除

行の削除を行う際はdコマンドを使います。アドレスやパターンと一緒に指定します。

コマンドで確認

$ sh hello.sh 3 | sed -e '1d' -e '$d'  # 先頭行&末尾行の削除
2 hello! 123

$ sh hello.sh 3 | sed '/^[13]/d'       # 先頭が「1 or 3」の行削除
2 hello! 123

特定の行だけに作用する

sedの処理は行単位ですが、アドレシングを指定して特定の行だけに作用させることができます。置換s削除dコマンドの前に、開始行番号,終了行番号を書くと対応した範囲にだけコマンドを適用することができます。尚、開始や終了は、それぞれ省略することができます。行番号の代わりに、パターン(/pattern/s/...)を指定するとパターンに合致した行だけに、コマンドを適用することができます。また、置換した行だけ表示させる場合は、パターンスペースを自動表示を抑制する-nオプションと表示に関するpフラグを組み合わせると良いです。

コマンドで確認

$ sh hello.sh 3 | sed '1,3s/hello/HELLO/'      # 1〜3行目
1 HELLO! 123
2 HELLO! 123
3 HELLO! 123

$ sh hello.sh 3 | sed '/^[13]/s/hello/HELLO/'  # 先頭が「1 or 3」の行
1 HELLO! 123
2 hello! 123
3 HELLO! 123

$ sh hello.sh 3 | sed -n '2s/hello/HELLO/p'    # 置換した行だけ表示
2 HELLO! 123

条件からの除外

パターンで表現するには、否定の方法も知っておくと簡単にできる場合があります。否定は、置換コマンドsや削除コマンドdの前に、!を指定します。例えば、アドレシングを用いた場合に範囲を指定するのは容易ですが、飛び飛びで指定する場合は面倒です。除外したいパターンが明確な場合に、役に立つかもしれません。

コマンドで確認

$ sh hello.sh 3 | sed -n '2!s/hello/HELLO/p'         # 2行目以外(否定)
1 HELLO! 123
3 HELLO! 123

$ sh hello.sh 5 | sed -n '/^[24]/!s/hello/HELLO/p'   # 先頭「2 or 4」以外(否定)
1 HELLO! 123
3 HELLO! 123
5 HELLO! 123
スポンサーリンク