Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 替换大文件中固定数量的文本_Linux_Unix_Sed_Large Files_File Manipulation - Fatal编程技术网

Linux 替换大文件中固定数量的文本

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

我试图替换大日志文件中特定行上的少量文本(总共约40 mil行):

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

上面的命令工作正常,但是对
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