替换一个大文件

问题描述:

我试图在一个大的日志文件的特定行替换文本少量(总共〜40条密耳的线)的文本固定量:替换一个大文件

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

的目的这是用预期的唯一字符串“标记”一行,以便以后进行测试。

上述命令可以正常工作,但就地编辑sed(和perl)会创建一个临时文件,其代价很高。

有没有办法在文件中替换固定数量的字符(即5个字符和5个其他字符),而无需创建一个临时文件或一个非常大的缓冲区,该缓冲区会自动成为临时文件。

+0

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

你可以使用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

ex是一个脚本文件编辑器,因此它会在原地工作:

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

大多数编辑器不能正常工作:这意味着你不必保存任何东西,因为你写的所有内容都会在您正在编辑的文件。既不是。 – devsnd 2012-04-11 16:47:14