2012-04-11 140 views
1

我試圖在一個大的日誌文件的特定行替換文本少量(總共〜40條密耳的線)的文本固定量:替換一個大文件

sed -i '20000000s/.\{5\}$/zzzzz/' log_file 

的目的這是用預期的唯一字符串「標記」一行,以便以後進行測試。

上述命令可以正常工作,但就地編輯sed(和perl)會創建一個臨時文件,其代價很高。

有沒有辦法在文件中替換固定數量的字符(即5個字符和5個其他字符),而無需創建一個臨時文件或一個非常大的緩衝區,該緩衝區會自動成爲臨時文件。

+0

剛剛拆分日誌文件(按天,周,月,年,十年,百年,嚴重程度,任務或其他) – KurzedMetal 2012-04-11 15:46:05

回答

3

你可以使用dd替換一些字節的地方:

dd if=/dev/zero of=path/to/file bs=1 count=10 conv=notrunc skip=1000 

會寫1000個字節後10個零(0×00)。您可以將任何要替換的文件放入文件中,並在if參數中寫入路徑。然後,您必須將替換文件的大小插入count參數,以便讀取整個文件。

conv=notrunc參數告訴dd使文件的末尾不被截斷。

這應該適用於任何1字節的文件編碼。

+0

謝謝,我沒有想到用這個'dd'。但是這種方法的工作原理是設置跳過的字節數,而不是行。 – Alex 2012-04-11 16:54:46

+0

你可以使用'head'和'wc'(以及一些算術)來計算字節偏移量 – 2012-04-11 18:12:59

0

ex是一個腳本文件編輯器,因此它會在原地工作:

ex log_file << 'END_OF_COMMANDS' 
20000000s/.\{5\}$/zzzzz/ 
w 
q 
END_OF_COMMANDS 
+1

大多數編輯器不能正常工作:這意味着你不必保存任何東西,因爲你寫的所有內容都會在您正在編輯的文件。既不是。 – devsnd 2012-04-11 16:47:14