Unix中的sed命令不适用于大于3GB的文件

时间:2018-12-26 09:03:00

标签: unix sed

Sed命令在Unix中不适用于文件大小大于3GB的文件,以从文件中删除回车符和换行符。

我正在尝试从管道定界文件中删除换行符。

代码:

sed -i ':a;N;$!ba;s/\n|/|/g'   File.txt

这是一个管道分隔文件,因此我首先搜索行尾,然后用管道替换新的行字符。

样本输入:

Test|A|B|C
|D

替换后-预期输出:

Test|A|B|C|D

Sed命令在所有小于3 GB的文件上都能正常工作,但对更大文件不起作用。

1 个答案:

答案 0 :(得分:2)

问题是您的sed命令首先将整个文件读入内存:

:a        # label a
N         # add next line to pattern space
$!ba      # if not on last line ($!) branch to label a

由于模式空间保存在主存储器中,因此如果输入足够大的空间,最终将失败。

考虑到您需要的简单替换,只需几行就可以进行替换,例如:

:a        # label a
N         # add next line to pattern space
s/\n|/|/  # substitute new-line pipe by pipe
ta        # if last substitution was successful branch to label a
P         # print first line of pattern space
D         # delete first line of pattern space

单线:

sed -n ':a; N; s/\n|/|/; ta; P; D' File.txt