2016-09-29 4 views
-2

私は、ファイルの最後の行をファイルの先頭に移動するために、unixフォーラムでこのmagicalコマンドを見つけました。私はsedをかなり使っていますが、この程度ではありません。誰かが私に各部分を説明することができますか?誰かが私のためにこのsedコマンドを破ることができますか?

sed '1h;1d;$!H;$!d;G' infile 
+0

ここから開始:https://www.gnu.org/software/sed/manual/html_node/index.html –

+0

「man sed」または「info sed」は、魔法を解明するのに適した出発点です。助けを読んだ後も、このコマンドが何をするのか分からない場合は、aaginにお尋ねください。 – Pablo

答えて

1

はい、エキゾチックコマンドを使用します。

  • 1H:
  • 1D:
  • 最初の行を削除$スペース(::1つのホールドスペースのデータとパターンスペースを維持するために、実際に処理ラインのsedは、2つのスペースを持っている)、「ホールド」で最初の行を置きます!H:すべての行を追加しますが、dコマンドが次の行にスキップした最初の行を最後の行に追加します。
  • $!d:最後の行を除くすべての行を削除します(印刷しません)
  • G:パターンスペースの内容に改行を追加します(これは最後の行で、スクリプトのその部分に到達できる唯一の行です)。そしてappen d。ホールドスペースの内容をパターンスペースの内容に置き換えます。パターンスペースはすぐに印刷されます。スワップが完了しました。

意見に基づくコメント:私はsedを使用していることを私がやって考えなかっただろう認めなければならない、と私はawkに...このコマンドが何をやっていたのを私に納得させるためにテストをしなければならなかっただろう、それははるかに簡単です。 しかし、sedには私の心の中には特別な場所があります。いくつかのsed候補がCodeGolfにあるのだろうか:)

0

ここでは、以上の手続きに見える擬似コードで同じコマンド:

for line in infile: 
    # Always do this: Copy the current line to the pattern 
    pattern = line 

    # Process the script 
    if first line: 
     hold = pattern     # 1h 
     pattern = ""; continue   # 1d 
    elif not last line: 
     hold = hold + "\n" + pattern # $!H 
     pattern = ""; continue   # $!d 
    pattern = pattern + "\n" + hold # G 

    # Always do this after the script is completed. 
    # Due to the continue statements above, this 
    # isn't always reached, and in this case 
    # is only reached for the last line. 
    print pattern 
  • dは、残りのスクリプトを実行せずにパターンスペースを消去し、次の入力行に進みます。

  • hは、パターンスペースをホールドスペースにコピーします。

  • Hは、保留スペースに改行を追加し、保留スペースにパターンスペースを追加します。
  • Gは、Hのようですが、他の方向にあります。ホールドスペースをパターンスペースにコピーします。

N行のファイルに対する全体的な影響は、1行目からN-1行目までのホールドスペースのコピーを作成することです。パターンが行Nを保持している場合は、パターンスペースにホールドスペースを追加し、パターンスペースを標準出力に出力します。

関連する問題