2011-08-05 68 views
27

我必须在一个相当大的文件上执行一些查找和替换任务,大小约为47 GB。查找并替换47GB大文件中的文本

有谁知道如何做到这一点?我尝试使用像TextCrawler,EditpadLite等服务,但没有任何支持这个大文件。

我假设这可以通过命令行完成。

你有什么想法可以实现这一点吗?

+0

你要在32位操作系统上运行这个就> newfile? – sarat

+0

64位,窗户SE7EN – Shrayas

+0

如果你在64位架构上运行,该文件的大小是不是真正的大问题,除非工具 – sarat

回答

25

Sed(用于过滤和转换文本的流编辑器)是您的朋友。

sed -i 's/old text/new text/g' file 

sed一次执行文本转换。

+1

它可以解决的文件的大小限制是多少?根据架构(32/64位)有没有限制? – sarat

+0

看看http://sed.sourceforge.net/sedfaq6.html - >看起来没有限制要关心。 – Ryan

+0

看起来不错,但我运行Windows 7。 SED是一个unix util,不是吗? – Shrayas

0

如果您使用的是Unix系统,那么您可以使用cat | sed的做到这一点

cat hosted_domains.txt | sed s/com/net/g 

实例替换净COM在域名列表,然后你可以将输出到文件中。

+9

您应该跳过'cat'并改写'sed's/foo/bar/g'FILE'。 –

+0

对于一个初学者的问题,也许还解释说,'/ g'只有当一行中可能出现多次时才需要。很经常,默认行为 - 只替换第一次出现 - 正是你想要的,并且添加'/ g'什么也没有完成,除了可能使它慢一点;或者,在最糟的情况下,是一个错误。 (是的,失去[cat']的无用用法(http://www.iki.fi/era/unix/award.html)。) – tripleee

+0

@tripleee你怎么知道只替换每行的第一次出现是有人想要什么?如果我想替换文本中的某些内容,我通常要替换所有出现的内容。不仅仅是第一行。 –

24

我使用FART - 查找和替换文字由Lionello Lunesu。

它在Windows 7 x64上运行得非常好。

您可以查找和替换使用此命令文本:

fart -c big_filename.txt "find_this_text" "replace_to_this" 
+18

哈哈FART ...很抱歉的评论,但有人不得不说出来! – JDuarteDJ

+0

那个网站很棒 – user1003916

+0

下载没有想到两次。我的意思是,谁不安装一个像屁一样光荣的名字。 –

0

对我来说没有任何的工具,建议在这里工作得很好。 Textcrawler吃了我所有电脑的内存,SED根本无法工作,Editpad抱怨内存...

解决方法是:在python,perl甚至C++中创建自己的脚本。

或使用PowerGrep工具,这是最简单和最快的选择。

我没有试过放屁,它只是命令行,也许不是很友好。
一些hex编辑器,比如Ultraedit也很好用。

+0

使用UltraEdit替换大文件时,可以在不使用临时文件的情况下使用UltraEdit完成大文件替换,这样可以在不进行撤消录制的情况下进行替换,甚至可以更好地使用文件___中的__Replace *文件/类型*文件名和*目录*指定文件路径(作为例子),并且在UltraEdit中根本不打开文件。请参阅UE论坛[如何快速运行Perl正则表达式将全部替换为大文件?](https://www.ultraedit.com/forums/viewtopic.php?f=8&t=16401)和[查找并替换HEX在文件](https://www.ultraedit.com/forums/viewtopic.php?f=8&t=15990)。 – Mofi

+0

我已经在Ultraedit中禁用临时文件。虽然我不知道“替换文件”选项。 – skan

+0

UltraEdit对于超过1GB的sql文件是一块蛋糕,取代了200k +字符串的出现。 –

5

在Unix或Mac:

SED的/ oldstring/newstring/G'oldfile.txt> newfile.txt

快速和容易...

+0

Downvote:这复制了2011年的现有答案。 – tripleee

+0

@tripleee可能是。但他只是给出了运行sed的命令。所以+1 – jafarbtech

+0

我不认为复制47GB文件(通过写入新位置)是一个非常明智的想法。 –

0

使用sed(流的编辑器过滤和转换文本),它可以一次执行文本转换。

sed -i 's/old/new/g' bigfile.txt 
-1

我用

sed 's/[nN]//g' oldfile.fasta > newfile.fasta 

更换n的所有实例在我的7GB文件。

如果我省略> newfile.fasta方面,它会花费年龄,因为它向上滚动屏幕会显示文件的每一行。

有了它,跑了几秒钟的事Ubuntu的服务器