Next: , Previous: Execution Cycle, Up: sed Programs


3.2 sedで行を選択する

sedスクリプトのアドレスは,以下の形式のいずれかになります.

number
行番号の指定は,入力のその行だけにマッチします.(sedは, -i-sオプションが指定されていない限り,入力ファイル 全体に渡って,連続して行を数えることに注意してください.)
first~step
このGNUの拡張は,行firstで始まりstep番目ごとの行 にマッチします.特に,負ではないnが存在するとき,現在の行番号が first + (n * step)になる行が選択されます.このため, 偶数行を選択するには,‘1~2’を使用することになるでしょう.二行目か ら始まり三行ごとに取り上げるには,‘2~3’を使用することになるでしょ う.十行目から始まり五行ごとに取り上げるには,‘10~5’を使用すること になるでしょう.そして,‘50~0’は‘50’とする分かりにくい方法に すぎません.
$
このアドレスは,入力の最後のファイルの最後の行や,-i-sオプションが指定されているときは,それぞれのファイルの最後の 行にマッチします.
/regexp/
正規表現regexpにマッチする全ての行を選択します.regexp自身 に/文字が含まれる場合,それぞれバックスラッシュ(\)でエス ケープする必要があります.

空の正規表現‘//’は,前回の正規表現に繰り返しマッチします(それは, 空の正規表現がsコマンドに渡されても同じです).正規表現を編集する と,正規表現がコンパイルされるときに評価されるので,空の正規表現ととも にそれらを指定することは不正な処理になることに注意してください.

\%regexp%
(%は他の任意の単一の文字で置換してもかまいません.)

これは正規表現regexpにもマッチしますが,これで/以外の分離 文字を使用することが可能になります.regexp自身が大量の/を 含んでいる場合,個々の/をエスケープするのも退屈なので,それを避 けるとき特に役に立ちます.regexp自身が分離文字を含んでいる場合, それぞれをバックスラッシュ(\)でエスケープする必要があります.

/regexp/I
\%regexp%I
正規表現のマッチに対するI指示語はGNUの拡張で,それによ りregexpは大文字小文字を無視してマッチします.
/regexp/M
\%regexp%M
正規表現のマッチに対するM指示語は,GNU sedの拡張で, ^$を(通常の動作に加え)それぞれ改行後の空の文字列と改行 前の空の文字列にマッチさせます.これらは特殊文字のならびです.

(\`\') それは,バッファの最初と最後にマッチします.Mmulti-lineを意味します.

アドレスが与えられていない場合,全ての行がマッチします.一つのアドレス が与えられている場合,マッチする行はアドレスがマッチしたものだけになり ます.

アドレスの範囲はカンマ(,)で分けられている二つのアドレスで指定す ることで指定することが可能です.アドレスの範囲は最初のアドレスにマッチ している行から始まり,二番目のアドレス(これは含まれます)にマッチするま で続きます.

二番目のアドレスがregexpの場合,マッチの終りの調査は,最初のアド レスにマッチした行の次の行から開始されます.範囲は常に少なくとも 二行になります(入力ストリームが終わる場合はもちろん例外です).

二番目のアドレスがnumberで,最初にマッチした行のアドレスより小さ い(または同じ)場合,一行のみマッチします.

GNU sedも特殊な二つのアドレス形式をサポートしています.これらはす べてGNUの拡張です.

0,/regexp/
sedが最初の入力行でもregexpへのマッチを試みるように, 0,/regexp/のように,アドレス指定で行番号の0を使用す ることが可能です.言い替えると,0,/regexp/1,/regexp/に似ていますが,addr2が入力の最初の行にマッ チする場合,0,/regexp/の形式では範囲の終わりだと考慮されま すが,一方1,/regexp/の形式ではその範囲の最初にマッチするの で,正規表現が二番目にマッチするのが見つかるまで範囲が広げられま す.

これは,0のアドレスに意味がある場所だけだということに注意してく ださい.0番目の行はなく,それ以外の方法では,0のアドレスに該当す るコマンドはエラーとなります.

addr1,+N
addr1addr1に続くN行にマッチします.
addr1,~N
addr1と,入力の行番号がNの倍数になるまでのaddr1に続く 行にマッチします.

アドレス指定の終りに!文字を後置すると,マッチの意味が否定されま す.すなわち,!がアドレスの範囲に続いている場合,選択されたアド レスの範囲にマッチしない行だけが選択されます.これは一つのアドレ スに対しても動作し,おそらくひねくれているだけでしょうが,何もないアド レスに対しても動作します.