sedコマンドを全行に実行させたくない場合は内部コマンドの適用範囲を指定しよう(含む、含まない、特定の行のみ、数行毎に、など)
はじめに
シェルスクリプトでデータを絞り込む方法いろいろ(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行目が削除される。
指定した条件に 該当しない 行にコマンドを実行(【否定演算】)
!
を絞り込み条件に付与する。
ひとこと
もう少し複雑な例は次回にでも。
ディスカッション
コメント一覧
まだ、コメントがありません