sedもいよいよ肉詰めピーマンじゃなかった大詰めの段階に入ってまいりました。今回は置換以外のコマンドを扱うのに必須のアドレスの話です(検索置換の場合でも使用しますが)。
アドレスって一体何かといえば、行指定のことなんです。
あれ一言で終わっちゃったい。 それじゃあんまりなのでもう少し詳しく。アドレスには、行アドレスとパターンアドレスの2種類があります。おしまい。
こんなところで終わるなっちゅ~に。え~っと。前回までの検索置換 のお話のなかではアドレスは指定しておりませんでした。というのは、検索置換をすべての行に適用したかったからです。ぜ~んぶの行の中から探して置換せよ!と言っていたからですね。それが、アドレスを指定すると、地域限定となるですよ。
つまり。行アドレスだと、何行目だけにコマンドを適用しなさいという、行番号を指定します。それ以外の行をsedは無視します。一方、パターンアドレスだと、そのパターン(正規表現や文字列などで指定)がある行だけにコマンドを適用しなさいということになります。
アドレスは、sed構文の中ではコマンドのすぐ前に置きます。 では例をあげて~いこ~~よお。
こんなファイルsample.txtがあったとさ。
千葉・船橋市
千葉・柏市
東京・江東区
検索置換で千葉のあとの・を県にしたいとき。パターンアドレス指定だと、こういう文になります。
sed "/千葉/s/・/県/" sample.txt
置換コマンドのsの前に、/千葉/をつけ、「千葉という文字列が入っている行だけで、・を県に変えなさい!」と言っているわけです。パターンアドレス指定の場合は、前後をスラッシュ(/)で囲むことに注意!
行指定だと、変換したいのは、1行目と2行目ですので、
sed "1,2s/・/県/" sample.txt
となります。カンマ(,)を行番号の間に置き、1行目から2行目までという意味にしています。ちなみに、 3,10だと3行目から10行目までということになります。行指定の場合は、行番号の前のスラッシュは不要です。
パターンアドレス指定と行指定は1つの文の中で混在させても使えます。
たとえば、1行目から最初の空行(空行は、正規表現で^$と表すのを思いだしてください)までを指定したいときは、1,/^$/とします。
さてこれで置換以外のコマンドに入る準備ができました。来週の第10回でsedの基本は終わることになります。では。来週までしばしお待ちを(^0^)