2016-09-29 53 views
-2

我在unix論壇上發現了這個神奇的命令,將文件的最後一行移動到文件的開頭。我用了很多sed,但沒有達到這個程度。有人可以向我解釋每個部分嗎?有人能爲我打破這個sed命令嗎?

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

start here:https://www.gnu.org/software/sed/manual/html_node/index.html –

+0

'man sed'或'info sed'是解開魔法的好起點。如果在閱讀幫助後,你仍然不明白這個命令是幹什麼的,請問阿金。 – Pablo

回答

1

是的,它使用了奇特的命令。

  • 1H:把第一行的「持有」空間(SED有2位:1個保持空間來保存數據和圖形空間:實際加工線)
  • 1D:刪除第一行
  • $ !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時,將保持空間附加到圖案空間並將圖案空間打印到標準輸出。

相關問題