2011-01-23 49 views
0

無論文件長度如何,我都想用sed操作文件的最後7行。SED:無論文件長度如何,最後七行操作

根據related question這種類型的範圍將無法正常工作:$-6,$ {..commands..}

什麼等價即會是什麼?

+2

(a)你不能 - 'sed`是這項工作的錯誤工具。 (b)如果你不夠堅持,可以探索保持空間和模式空間,並嘗試在保持空間中保留7條線(或者6條線),然後在模式空間滿足時處理保持空間最後一行。但是這非常困難 - 我真的不打擾(我用`sed`完成了可怕的事情,但是有一點可以爲你選擇正確的工具)。 – 2011-01-23 22:16:36

回答

2

tail -7的輸出流入sed。在管道here.

+0

布賴恩,我不能使用這個解決方案,因爲我正在使用需要與其他範圍一起使用此範圍(例如,我需要處理同一文件的前六行和最後七行,並返回處理後的文件 – tjb 2011-01-23 21:49:03

+1

In在這種情況下,我建議使用python或perl腳本來處理文件(我偏向python ...)它可能會更容易維護。 – Bryan 2011-01-23 21:53:47

1

你可以只從sed的(1)ED(1),該命令是差不多的切換

tail -7 test.txt | sed -e "s/e/WWW/" 

更多信息。在這種情況下,命令相同,但地址範圍沒有限制。

$ cat > fl7.ed 
ed - $1 << \eof 
1,7s/$/ (one of the first seven lines)/ 
$-6,$s/$/ (one of the last seven lines)/ 
w 
q 
eof 
$ sh fl7.ed yourfile 
0

這應該爲你工作:

sed '1{N;N;N;N;N};N;$s/foo/bar/g;P;D' inputfile 

說明:

  • 1{N;N;N;N;N} - 當第一行被讀取時,有五個多線負載模式空間(總:6在這一點上)
  • N - 追加另一行
  • $s/foo/bar/g - 當讀取最後一行時,對en執行一些操作模式空間的輪胎內容(文件的最後七行)。操作可能比這裏顯示
  • P更復雜的 - 第一個換行符之前打印的測試圖案空間
  • D - 刪除剛剛打印和循環到腳本(下稱「追加另一條線」的步驟開始的文字 - 第一個指令被跳過,因爲它僅適用於第一行的文件中)
0

這可能會爲你工作:

sed ':a;1,6{$!N;ba};${s/foo/bar/g;q};N;D' file 

說明:

  • 創建一個循環標籤。 :a
  • 在模式空間(PS)中收集第1至第6行。 1,6{$!N;ba}
  • 如果是最後一行,則處理PS並退出,因此打印出最後七行。 ${s/foo/bar/g;q}
  • 如果不是最後一行,請將下一行追加到PS。 N
  • 刪除直到第一個換行符,並開始一個新的循環,而不讀新行。D