この sed コマンドが実行するアクション: sed '1!G;h'

この sed コマンドが実行するアクション: sed '1!G;h'

私はsedをよりよく理解しようとしていますが、オンライン文書とマニュアルページを繰り返し閲覧したにもかかわらず、混乱しています。

私がそうするなら:(以内bash

echo "
alpha
beta
gamma" | sed '1!G;h'

わかります:

alpha
beta
alpha
gamma
beta
alpha

1!Gしたがって、ライン1を除く各入力ラインの後に新しいラインが追加されることがわかります。次に、hパターンスペースを予約済みスペースにコピーします。ただし、ホールドスペースでは何も起こらずにパターンスペースを出力する必要があります。この時点で、私は次のような1!G;h出力を見ることを期待しています1!G

alpha
beta

gamma

保持スペースは何とかエクスポートされますか?予約されたスペースが各ラインのパターンスペースの後に出力される場合、sed 'h'各ラインを2倍に増やすことはどうですか?

ああ、私はこれをmacOS Mojave 5で実行していますbash。どのバージョンを使用しているかはわかりませんが、sed最新のmacOSに付属しているデフォルトバージョンです。

ベストアンサー1

G最初のコマンドは書きましたが、2番目のコマンドは作成した予約済みスペースに追加することを忘れました。

sed h各サイクルで予約されたスペースをカバーするので、各行を2倍にすることはありません。

最初のコマンドは次のとおりです。

sed '1!G;h' <<END_INPUT
alpha
beta
gamma
END_INPUT

そして出力

alpha
beta
alpha
gamma
beta
alpha

最初の行を除くすべての行に区切り線を使用して、現在予約されているスペースをパターンスペースに追加します。次に、ホールドスペースをパターンスペースで上書きします。各サイクルの終わり(入力ラインを処理した後)に暗黙的なp(印刷)コマンドがあります。

これを別の方法で表現すると、「各入力行に対して前の行をすべて逆順に出力します(最後に新しい行)」です。

だからコードは

  1. alphaパターンスペースで読む、alpha予約済みスペースにコピー、印刷alpha
  2. betaパターンスペースで読み取る、\nalpha予約済みスペースからパターンスペースとして追加、予約済みbeta\nalphaスペースにコピー、印刷beta\nalpha
  3. gammaパターンスペースを読み取り、\nbeta\nalpha予約済みスペースからパターンスペースとして追加し、gamma\nbeta\nalpha予約済みスペースにコピーして印刷しますgamma\nbeta\nalpha

パスワード

sed '1!G' <<END_INPUT
alpha
beta
gamma
END_INPUT

出力

alpha
beta

gamma

(3行目と最後行は空です。)

このsedコードは入力の各行を出力し、最初の行を除くすべての行に追加の改行を追加します。そうなるからこうするのだ

  1. alphaパターンスペースを読み、印刷しalpha
  2. betaパターンスペースを読み取り、\n予約済みスペースからパターンスペースとして追加して印刷しますbeta\n
  3. gammaパターンスペースを読み取り、\n予約済みスペースからパターンスペースに追加して印刷しますgamma\n

ここに予約済みスペースを追加すると、Gパターンスペースの末尾に追加の改行のみが追加されます。なぜなら、パターン空間は常に空であるからです(書き込みをしないので)。

おすすめ記事