sedで処理対象のアドレス(行)指定
sedのコマンドの構文は、「アドレス コマンド」。例えば、
sed -e '5,10 s/a/A/'
だと、5行目から10行目だけを対象に置換する。行指定とコマンドの間のスペースはなくても良いが、見やすさのためにスペースを入れた。
sed -e 's/a/A/'
のようにアドレスを省略すると入力ファイル全体が処理対象になる。
※アドレスを取らないコマンドもある。
アドレスは上の例のように行番号で指定できるし、他にもいくつかの方法がある。詳しくはマニュアルで。
正規表現によるアドレス指定
アドレスの指定方法の一つに正規表現がある。「/regexp/」のようにスラッシュで囲む。これを使うとそれにマッチする行だけを処理対象にできる。以下、いくつかサンプルを。
まず、入力ファイル。
この四行のファイルが今回の処理対象。
アドレス指定なし
アドレス指定を省略すると入力ファイル全体が対象になる。
半角のマイナス「-」を全角に置換した。四行、すべて置き換わっている。
特定のパターンの行だけを処理
では、正規表現を使って、指定したパターンがある行だけを対象にしてみる。
「/http/」と指定したので、この行だけが置換対象になっている。
特定のパターンがない行だけを処理
今度は逆に、そのパターンがある行だけを処理対象から除外する。
「/http/!」と「!」を付けることで、「否定(除外)」を指定できる。
複数のパターンを含まない行を処理
パターンAかパターンBのどちらかを含む行を処理対象にするのは簡単。sedスクリプトを複数並べればいいだけだから。
逆に、パターンAもパターンBも含まない行を処理対象にしようと思うとちょっと頭をひねる。これが、今回の記事のメインテーマ。
これはブロックを使うことで実現できる。ブロックは波括弧で囲む。早速例を。
「/http/!」で「httpを含まない」を指定し、ブロックを続ける(ブロックもsedのコマンドの一つ)。そのブロックの中で「/Pay-easy/!」と除外指定。結果、「httpもPay-easyも含まない行」が処理の対象になる。
ブロックをもう一段続けて「e-Taxも含まない」としたものがこちら。
こういう除外指定にちょっと悩んだのでまとめてみた。
コメント