编辑大文件的第一行和最后一行

时间:2014-06-10 16:37:26

标签: linux sed large-files

我想在一个非常庞大的文件(~500GB)中编辑第一行和最后一行。怎么会这样?例如,在第一行中我有:

-flag </begin> 

我想省略“-flag”。我尝试使用sed(如图所示)编辑第一行,但我没有工作:

sed -i '1s/-flag <begin>/<begin>/g' file.txt 

4 个答案:

答案 0 :(得分:2)

我想不出你可以就地做到这一点的方式(我有兴趣听一个!)

几乎没有单行,但你可以尝试一下:

# substitute the first line and exit
sed '1s/-flag \(.*\)/\1/;q' file > new        
# add the rest of the file (probably quicker than sed)
tail -n +2 file >> new    
# cut off the last line of the file
truncate -s $(( $(stat -c "%s" new) - $(tail -n 1 new | wc -c) )) new
# substitute the last line                             
tail -n 1 file | sed 's/-flag \(.*\)/\1/' >> new

这假设您有一些工具,例如truncate,并且您可以在shell中进行算术运算(我的shell为bash)。

truncate -s通过取总文件大小stat -c "%s"与最后一行长度(以字节为单位)之间的差异来删除最后一行。

我不确定你要从最后一行删除的是什么,但我认为它与第一行相同(从行的开头删除-flag)。

欢迎建议修改。

答案 1 :(得分:1)

如果您只想在第一行中删除-flag(请注意尾随空白):

sed -i '1s/-flag //' file

如果要完全替换第一行的内容,可以发出

sed -i '1s/.*/new first line/' file

要对最后一行做同样的事情(我以此为例,因为你没有说出你想对最后一行做什么),你做

sed -i '$s/.*/new last line/' file

答案 2 :(得分:0)

通常,更改文件的开头需要完全重写文件 - 原因与文件系统工作方式相关的原因有很好的解释here

但如果您在保持完全相同的长度的同时重写该行,则有一个技巧就地编辑

执行此任务的简单命令行工具将是hexedit在linux上(请参阅其快捷方式there)。它非常快,因为只需要将更改的字节写入磁盘。但是,它要求新行具有相同数量的字符,这并非总是可行。

在OP情况下,将-flag替换为5&#34;空间&#34;可能就足够了。字符,但其他情况可能更难处理。

答案 3 :(得分:0)

发现sed具有-i选项,可以在适当位置更改文件。 并且可以删除带有标志nd的行号n,第一行为1d。还有最后一行的$ d

删除第一行

sed -i 1d yourfile.txt

删除最后一行

sed -i '$d' yourfile.txt

更多信息在这里: https://stackoverflow.com/a/53433208/9475713