Linux 替换大文件中固定数量的文本
我试图替换大日志文件中特定行上的少量文本(总共约40 mil行): 这样做的目的是用预期的唯一字符串“标记”一行,以便以后进行测试 上面的命令工作正常,但是对Linux 替换大文件中固定数量的文本,linux,unix,sed,large-files,file-manipulation,Linux,Unix,Sed,Large Files,File Manipulation,我试图替换大日志文件中特定行上的少量文本(总共约40 mil行): 这样做的目的是用预期的唯一字符串“标记”一行,以便以后进行测试 上面的命令工作正常,但是对sed(和perl)的就地编辑会创建一个临时文件,这是非常昂贵的 是否有一种方法可以替换文件中固定数量的字符(即5个字符替换为5个其他字符),而无需创建临时文件或非常大的缓冲区,缓冲区最终会变成临时文件。您可以使用dd替换某些字节: dd if=/dev/zero of=path/to/file bs=1 count=10 conv=not
sed
(和perl
)的就地编辑会创建一个临时文件,这是非常昂贵的
是否有一种方法可以替换文件中固定数量的字符(即5个字符替换为5个其他字符),而无需创建临时文件或非常大的缓冲区,缓冲区最终会变成临时文件。您可以使用
dd
替换某些字节:
dd if=/dev/zero of=path/to/file bs=1 count=10 conv=notrunc skip=1000
将在1000s字节后写入10个零(0x00)。您可以将要替换的内容放入文件中,并将路径写入if
参数中。然后必须将替换文件的大小插入count
参数,以便读取整个文件
conv=notrunc
参数告诉dd
使文件结尾不受信任
这对于任何1字节的文件编码都很有效。是一个可编写脚本的文件编辑器,因此它可以在适当的位置工作:
ex log_file << 'END_OF_COMMANDS'
20000000s/.\{5\}$/zzzzz/
w
q
END_OF_COMMANDS
ex log\u文件只是拆分日志文件(按天、周、月、年、十年、世纪、严重程度、任务或其他方式),大多数编辑器都不工作:这意味着您不必保存任何内容,因为您编写的所有内容都在您正在编辑的文件中。谢谢,我没有想到要用dd
。但是这种方法的工作原理是设置要跳过的字节数,而不是行数。您可以使用head
和wc
(以及一些算法)计算字节偏移量
ex log_file << 'END_OF_COMMANDS'
20000000s/.\{5\}$/zzzzz/
w
q
END_OF_COMMANDS