1. ホーム
  2. linux

[解決済み] sedにおける「ホールドスペース」と「パターンスペース」の概念

2022-11-11 07:13:34

質問

sedの2つの概念、hold spaceとpattern spaceに混乱しています。誰かがそれらを説明するのを助けることができますか?

ここにマニュアルのスニペットがあります。

h H    Copy/append pattern space to hold space.
g G    Copy/append hold space to pattern space.

n N    Read/append the next line of input into the pattern space.

この6つのコマンドは本当に私を混乱させる。

どのように解決するのですか?

sedがファイルを一行ずつ読み込むとき、現在読み込んでいる行を パターン バッファ (パターンスペース) に挿入されます。パターンバッファは一時的なバッファのようなもので、現在の情報が格納されるスクラッチパッドです。sedに印刷を指示すると、パターンバッファを印刷します。

ホールドバッファ/ホールドスペースは、何かを捕まえて保存し、後でsedが別の行を処理するときに再利用できるような、長期保存のようなものです。ホールドスペースを直接処理するのではなく、コピーするか、パターンスペースに追加する必要があります。例えば、print コマンドは p はパターン・スペースだけを表示します。同様に s はパターン空間を操作する。

以下はその例である。

sed -n '1!G;h;$p'

(-nオプションは行の自動印刷を抑止します)

ここには3つのコマンドがあります。 1!G , h$p . 1!G にはアドレスがあります。 1 (1行目)がありますが ! は、コマンドがどこでも実行されることを意味します を除く全ての場所で実行されることを意味します。 $p は最後の行で実行されます。つまり、どうなるかというと、こうなります。

  1. 最初の行が読み込まれ、パターンスペースに自動的に挿入されます。
  2. 最初の行では、最初のコマンドは実行されません。 h は最初の行を ホールド のスペースにコピーします。
  3. ここで、2行目はパターンスペースにあったものを置き換えます。
  4. 2 行目では、まず G を実行し、ホールドバッファの内容をパターンバッファに追加し、それを改行で区切ります。パターンスペースには、2 行目、改行、1 行目が含まれます。
  5. 次に h コマンドはパターンバッファの連結した内容をホールドスペースに挿入し、ホールドスペースは現在、反転した2行目と1行目を保持しています。
  6. 3行目に進みます -- 上記(3)のポイントに移動してください。

最後に、最後の行が読み込まれ、ホールドスペース(前の行をすべて逆順で含む)がパターンスペースに追加された後、パターンスペースは、以下のように印刷されます。 p . ご推察の通り、上記はまさに tac コマンドと全く同じことをします -- ファイルを逆に表示します。