我正在尝试替换大型日志文件的特定行上的少量文本(总共约 40 百万行):
sed -i '20000000s/.\{5\}$/zzzzz/' log_file
这样做的目的是用预期的唯一字符串“标记”一行,以供以后测试。
sed
上面的命令工作正常,但是(and )的就地编辑perl
会创建一个临时文件,这很昂贵。
有没有一种方法可以替换文件中固定数量的字符(即 5 个字符和 5 个其他字符),而无需创建临时文件或非常大的缓冲区,这最终会成为临时文件本身。
我正在尝试替换大型日志文件的特定行上的少量文本(总共约 40 百万行):
sed -i '20000000s/.\{5\}$/zzzzz/' log_file
这样做的目的是用预期的唯一字符串“标记”一行,以供以后测试。
sed
上面的命令工作正常,但是(and )的就地编辑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
是一个可编写脚本的文件编辑器,因此它可以就地工作:
ex log_file << 'END_OF_COMMANDS'
20000000s/.\{5\}$/zzzzz/
w
q
END_OF_COMMANDS