1

機能するもの

この sed スクリプトは意図したとおりに機能します。

$ echo -e "2\n1\n4\n3" | sed -n 'h; n; G; p'
1
2
3
4

一度に入力行のペアを取り、行を交換します。ここまでは順調ですね。

機能しないもの

私が理解していないのは、sed の自動印刷を使用できない理由です。sed は各実行サイクルの最後にパターン スペースを自動的に出力するため (抑制されている場合を除く)、なぜこれは同等ではないのでしょうか?

$ echo -e "2\n1\n4\n3" | sed 'h; n; G'
2
1
2
4
3
4

コードが言うことは次のとおりです。

  1. 入力行が保留スペースにコピーされます。
  2. 次の行がパターン空間に読み込まれます。
  3. ホールド スペースはパターン スペースに追加されます。
  4. 実行サイクルの終わりに達したため、パターン スペース (行 1 + 改行 + 行 2) が自動的に出力されます。

明らかに、私は間違っています...しかし、理由がわかりません。この 2 番目の例が壊れる理由と、正しい結果を得るために印刷の抑制が必要な理由を説明できる人はいますか?

4

2 に答える 2

2

このnコマンドにより、sed は次の行を読み取る前に現在のバッファーを出力します。http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sed.htmlからの説明は次のとおりです。

[2addr]n
    Write the pattern space to standard output if the default
    output has not been suppressed, and replace the pattern
    space with the next line of input, less its terminating <newline>.
于 2012-06-29T14:24:49.647 に答える
0

これはあなたのために働くかもしれません:

echo -e "2\n1\n4\n3" | sed 'h;N;s/.*\n//;G'
1
2
3
4

またはこれ(GNU sed):

echo -e "2\n1\n4\n3" | sed '1~2{h;d};2~2G'
1
2
3
4

何が印刷されるlか、またはGNUを使用しているかどうかを調べるにはl0

于 2012-06-30T21:10:18.797 に答える