在Unix Shell中删除一个非常大的文件的前n个字符

4
我有一个大文本文件(约3GB)。在创建它时,我犯了一个错误,只有第一行的前几个字符(不是全部)是错误的。第一行中其余的字符是正确的。所有其他行也都是正确的。我的问题很简单:
如何删除这样一个大文件的前n个字符? 我不想删除整个第一行, 只是前面的n个字符。我的要求是:
  1. 不用替换所有剩余行。
  2. 不必读取整个文件。
  3. 最好使用Unix shell命令。
我尝试过sed,但是这会替换第一行并复制所有剩余内容...也许我可以使用“quit”选项?
当然,我可以再次创建文件,而不会犯那个错误...

可能是重复的问题如何使用bash/sed脚本删除文本文件的第一行? - Ciro Santilli OurBigBook.com
同样的原则:如何高效地从文件前面删除。答案:据我所知,在Linux中不可能。 - Ciro Santilli OurBigBook.com
1
相关链接:https://dev59.com/SGMl5IYBdhLWcg3w16B3简述:在不修改文件其余部分的情况下,从文件开头删除数据是很困难的。 - Joni
1
如果你担心没有足够的人看到并提供好的答案,你可以等几天并提供赏金。反复编辑不会有太大帮助。 - fedorqui
1
@fedorqui 我只会等几个小时。我没有编辑问题以获得更好的答案,只是为了将来的参考更清晰 :) - vefthym
显示剩余2条评论
1个回答

6

您可以使用:

sed -i.bak -r '1s/^.{10}//' file

这将创建一个备份文件file.bak并从第一行中删除前10个字符。注意,单独使用-i也可以进行原地编辑而不进行备份。

测试

原始文件:

$ cat a
1234567890some bad data and here we are
blablabla
yeah

让我们:

$ sed -i.bak -r '1s/^.{10}//' a
$ cat a
some bad data and here we are
blablabla
yeah
$ cat a.bak 
1234567890some bad data and here we are
blablabla
yeah

1
+1 好的回答,谢谢。然而,它会删除前10个字符,然后复制文件的其余部分。 - vefthym
1
你也可以像这样删除第一行的字符:sed -r '1{s/^.{10}//;q}' file > new_file,将其重定向到另一个文件。然后使用 tail -n +2 file >> new_file 获取从第二行开始的所有内容,最后使用 mv new_file file 替换原始文件。 - fedorqui
好观点!不过,我理想中想要的功能是:删除前n个字符,然后停止。而你所描述的更像是:删除前n个字符,复制文件的其余部分,然后停止。对吗? - vefthym
1
好的,我不认为有这样的事情。请注意,从文件开头删除内容意味着移动其余部分。 - fedorqui
1
不管你使用 MS Word 还是 vi 编辑器,如果你从开头删除了一些字符,那么随后的字符就会自动移到前面。 - cppcoder
1
你们两个都是对的,我的问题中关于编辑器的观点是无关紧要的。所以,如果没有办法确切地做到我想要的,我猜@fedorqui的答案是我能得到的最好的答案。 - vefthym

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