はじめに
シェルスクリプトでデータを絞り込む方法いろいろ(grep、sed、awk) で sed コマンドを使った絞り込み方法について触れたので、 sed コマンドに関してのみもう少し深掘りしてみたいと思います。
検証環境
| |
sedの内部コマンド
sed コマンドは標準入力あるいはファイルに対して、 内部コマンド を指定しその結果を出力する、というコマンドです。
ややこしいですが、 sed の中だけで使えるコマンド、という意味です。
内部コマンド は全行に対して、行単位に実行されます。
内部コマンドの例をいくつか上げます。
i: 行の前に一行追加し、引数として指定した文字列を追加a: 行の後に一行追加し、引数として指定した文字列を追加d: 削除するp: 出力するs: 正規表現で置換処理する
sedの内部コマンドは全ての行に適用される
先述したとおり、適用範囲の指定がない sed のコマンドは、全ての行に対して適用されます。
| |
「すべての行を置換する」といった操作の場合には想定通りですが、「行を削除する」といった操作の場合は範囲指定ができなければ意味がありません。
sedの内部コマンドの対象行を絞り込もう
強力な sed の力をさらに引き出すには、内部コマンドを適用する「行」を絞り込む方法を知る必要があります。
sedの内部コマンド実行範囲の絞り込み方法いろいろ
ようやく本題に入ります。 内部コマンドの実行範囲を指定する方法について触れていきます。
ここでは挙動が一番わかり易い d オプションを取り上げていきます。
またいつものように、検証用のデータを作成します。
| |
単一行にコマンドを実行(ex:2行目を削除したい)
コマンドの前に数値で行を指定します。
| |
複数行にコマンドを実行(ex:2〜6行目を削除したい)
コマンドの前に数値で行を2つ指定します。 カンマの前がコマンドの適用開始行、後ろがコマンドの適用終了行になります。
| |
特定の文字を含んだ行にコマンドを実行(ex:“男"を含む行を削除したい)
コマンドの前に対象となる行に含まれる文字を “/” で囲んで指定します。
| |
正規表現も使用できます。
| |
任意の2つの行の間にコマンドを実行(ex:“男"を含む行から次に"男"が見つかった行までを削除したい)
“/” を指定した絞り込み方法も、 “,” の前後にそれぞれ記述し適用範囲を指定する事ができます。
| |
行数の指定方法と組み合わせることもできます。
| |
任意の行から最後のまでコマンドを適用
$ は最後の行を表す特殊なアドレスとして指定できます。
| |
n行毎にコマンドを実行
0~3 のようにチルダの前後に数値を入れてやる。
上記の例だと 「3で割ったあまりが0となる行」 を指定しているので、3,6,9行目が削除される。
| |
指定した条件に 該当しない 行にコマンドを実行(【否定演算】)
! を絞り込み条件に付与する。
| |
ひとこと
もう少し複雑な例は次回にでも。