私は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
(印刷)コマンドがあります。
これを別の方法で表現すると、「各入力行に対して前の行をすべて逆順に出力します(最後に新しい行)」です。
だからコードは
alpha
パターンスペースで読む、alpha
予約済みスペースにコピー、印刷alpha
、beta
パターンスペースで読み取る、\nalpha
予約済みスペースからパターンスペースとして追加、予約済みbeta\nalpha
スペースにコピー、印刷beta\nalpha
、gamma
パターンスペースを読み取り、\nbeta\nalpha
予約済みスペースからパターンスペースとして追加し、gamma\nbeta\nalpha
予約済みスペースにコピーして印刷しますgamma\nbeta\nalpha
。
パスワード
sed '1!G' <<END_INPUT
alpha
beta
gamma
END_INPUT
出力
alpha
beta
gamma
(3行目と最後行は空です。)
このsed
コードは入力の各行を出力し、最初の行を除くすべての行に追加の改行を追加します。そうなるからこうするのだ
alpha
パターンスペースを読み、印刷しalpha
、beta
パターンスペースを読み取り、\n
予約済みスペースからパターンスペースとして追加して印刷しますbeta\n
。gamma
パターンスペースを読み取り、\n
予約済みスペースからパターンスペースに追加して印刷しますgamma\n
。
ここに予約済みスペースを追加すると、G
パターンスペースの末尾に追加の改行のみが追加されます。なぜなら、パターン空間は常に空であるからです(書き込みをしないので)。