sed:パターン間の複数の範囲、一度に渡される

sed:パターン間の複数の範囲、一度に渡される

約3GBのファイルを読み込み、パイプを介して転送するスクリプトがありますが、これはファイルの小さな部分でほとんど置き換えられません。最小限のオーバーヘッドでこれを行うために、スクリプトは置換が行われる小さな既知の範囲を指定しますsed '/begin/,/end/'

同じファイル内の他の小さな既知の「正規表現で区切られた」範囲にいくつかの代替項目を追加したいと思います。 sedを介して再パイプすると、不要なオーバーヘッドが発生し、拡張がうまくいきません。

ファイルに表示される順序がわかっている場合は、ファイルを一度だけ読み取るようにパターン間の2つの範囲を指定する方法はありますか?

'sed '/begin1/,/end1/ ... /begin2/,/end2/'私の考えはこんな感じです。

これsed マニュアル状態

カンマ(、)で区切られた2つのアドレスを指定して、アドレス範囲を指定できます。

ただし、グループごとに2つのアドレスを指定することは言及されていません。

答え1

ファイルにどの範囲が最初に表示されるかを知る必要はありません。あなたは明らかなものを書くことができます:

#/bin/sed -f

/begin1/,/end1/{
# commands specific to range 1
}

/begin2/,/end2/{
# commands specific to range 2
}

動作します。

Sedは常に単一のパスで入力を繰り返し、各行を読み取り、ユーザーが提供したコマンドで処理して作成します(場合によっては作成しない場合があります)。パイプでsedを実行してこれを証明できます(パイプ入力は取得できないため、マルチパスは不可能です)。

関連情報