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的文件上都能正常工作,但对更大文件不起作用。
答案 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