ホールドバッファとモードバッファ間でデータを交換するとき、sedのxオプションは実際に何をしますか?

ホールドバッファとモードバッファ間でデータを交換するとき、sedのxオプションは実際に何をしますか?

ホールドバッファとパターンバッファの内容を交換するとき x が何をするのか理解できません。ホールドまたはパターンの古いデータが削除されるように、ホールドとパターン間でデータを交換しますか?結局何が起こったのですか?

答え1

おそらくこれを説明する最良の方法は、のようなより冗長な言語に翻訳することですperl。では、sedホールドスペースは空行で初期化された静的変数と同じですが、パターンスペースはsed入力の各行に順番に割り当てられる変数です。 。それは次のとおりです。

$hold_space = "\n";
LINE: while ($pattern_space = <>) {

  <sed commands go here>

  print $pattern_space; # unless -n option is passed
}

xパターンを変えて空間を維持すれば、まさにそのことになります。

($pattern_space, $hold_space) = ($hold_space, $pattern_space);

予約済みスペースには、パターンスペースに含まれる内容(他のコマンドで変更しない限り、現在の入力行)が含まれます。そして、パターン空間は保持空間に含まれるすべてに置き換えられるため、出力は次の入力行が処理される前に最後に行われます(パターン空間は新しい入力行に割り当てられます)。

パターン空間があなたが扱っているものです。したがって、その中にあるデータで何でもするには、その中にあるデータが必要です。保管スペースは、2行の入力を処理する間にデータを保管する必要がある場合に使用できる記憶域です。

g予約済みスペースをパターンスペースに入れますが、元のパターンスペースは失われます。x、予約済みスペースに古いパターンスペースを保持します。たとえば、予約済みスペースを編集するには、x;s/.../.../;x予約済みスペースを一部置き換えることができます。

関連情報