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

4

我希望编辑一个非常大的文件(~500GB)中的第一行和最后一行。该怎么做?例如,第一行是:

-flag </begin> 

我希望能够省略“-flag”这个选项。我尝试使用sed(如下所示)来编辑第一行,但是没有生效:

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

你想从最后一行中删除什么? - Tom Fenech
4个回答

4

我无法想到一种可以原地实现的方法(如果有,我很乐意听听!)

虽然不是一行代码,但你可以尝试这个:

# 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)。
欢迎提出建议修改。

如果您要用完全相同的文本替换现有文本,以便文件中其余部分的偏移量不会改变,那么您可以在原地进行操作。为此,您可以使用 dd 命令。由于 OP 的示例正在删除文本,因此整个文件的其余部分都需要被移动... - twalberg
在最后一步中,当您替换最后一行时,文件是什么意思? - NewToAndroid
我有一个1To的文件,在其中执行了"echo "</close>" >> my1tofile"命令。我需要删除这个最后一行(这是一个巨大的错误)。你们的哪个解决方案是最快的? - Olivier Pons
1
@OlivierPons 你应该使用这里的其中一种方法 https://dev59.com/OW445IYBdhLWcg3wZJew#17794626 (链接显示的答案在处理大文件时表现良好) - Tom Fenech

2

如果你只想在第一行中去掉-flag(注意末尾的空格):

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

如果您想完全替换第一行的内容,可以使用以下命令:
sed -i '1s/.*/new first line/' file

为了对最后一行执行相同的操作(我提供这个示例是因为您没有说明您想对最后一行做什么),您需要执行以下操作:
sed -i '$s/.*/new last line/' file

这不应该是一个快速的过程吗,因为我指定了行号吗?然而,我可以看到自从我执行命令以来sed一直在工作。 - NewToAndroid
在正则表达式中,破折号没有特殊含义(除了在字符类子语言中),因此不需要转义。 - tripleee
文件将从头到尾进行处理。无法仅重写文件的开头部分。 - tripleee

1
一般来说,更改文件开头需要完全重写整个文件 - 这与文件系统的工作原理有关,这在此处有很好的解释。
但是如果您在保持完全相同长度的情况下重写该行,则可以使用一个技巧:原地编辑。
在Linux上执行此任务的简单命令行工具是hexedit(请参见其快捷方式)。由于只需将更改的字节写入磁盘,因此它非常快速。但是,它要求新行具有相同数量的字符,这并不总是可能的。
在OP的情况下,可能只需用5个“空格”字符替换-flag,但其他情况可能更难处理。

0
发现sed有-i选项,可直接更改文件。您还可以使用nd标志删除第n行,其中1d表示删除第一行。$d表示删除最后一行。

要删除第一行

sed -i 1d yourfile.txt

删除最后一行

sed -i '$d' yourfile.txt

更多信息请参见: https://dev59.com/SXRC5IYBdhLWcg3wUfN2#53433208


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接