一个大文本文件中的多个搜索和替换操作


11

我有一个大文本文件(大约2GB)。我想对同一文件执行五次搜索和替换操作,并希望在一个命令中执行此操作。通常我使用vim,打开文件,执行一个替换操作,然后执行另一个操作,依此类推。有一个陷阱,因为我注意到三到四次搜索后,由于内存问题,vim崩溃了。

这是我在Vim中使用的命令的两个示例:

:%s/www\.abcdef/www.test.abcdef/g 
:%s/www\.klmnop/www.test.klmnop/g

处理此问题的最佳方法是什么?

Answers:


8

我会像这样使用sed:

sed -i "s/www\.abcdef/www.test.abcdef/g;s/www\.kmlnop/www.test.klmnop/g;" yourfile.txt

-i选项代表“就地”替换。您可以告诉sed创建文件的备份,并为此选项提供扩展名(-i.bak将yourfile.txt备份为yourfile.txt.bak)。


那太快了!不仅您的答案;-),而且具有5个搜索和替换功能的脚本比在vim中打开文件快约10倍。一件事使我困惑。起初,我认为.bak文件将是经过编辑的文件,但这当然是原始文件。
SPRBRN

一口气在2GB文件中进行十次搜索和替换操作(具有数千次匹配),没有内存问题。在普通台式机上不到两分钟-超级!
SPRBRN

一个问题...您可以替换字符串中的点。这有必要吗?
SPRBRN

1
不客气@rxt :)实际上,您是对的,您可以在中的替换字符串中使用非转义点sed。我尝试了,并且有效。Unix&Linux Stackexchange中有一个很好的线程,并且公认的答案没有提到点作为要转义的字符。
ssssteffff 2013年

2
@rxt,您说过替换字符串,对不起,不,您无需在此处进行转义。
terdon

6

如果还有更多搜索模式,则可以将它们保存在文件中,然后从中读取替代内容。例如,说这些是以下内容replacements.txt

www\.abcdef www.test.abcdef 
www\.klmnop www.test.klmnop

然后,您可以阅读N个替换项列表,并将其替换为:

while read from to; do
  sed -i "s/$from/$to/" infile.txt ; 
done < replacements.txt 

笔记:

  • 假设您的搜索字符串不包含空格,并且任何奇怪的字符都需要在中转义replacements.txt
  • sed每次更换将运行一次,如果您执行许多更换操作,则可能需要一段时间。
  • 只要您不介意替换会花费更多时间,它就可以处理任意数量的替换项(数千或数百万或其他)。

另一种选择是将以上内容编写为sed脚本:

s/www\.abcdef/www\.test\.abcdef/g;
s/www\.kmlnop/www\.test\.klmnop/g;
s/aaaa/bbbb/g;
s/cccc/dddd/g;
s/eeee/ffff/g;

然后,您可以在文件上运行脚本,它将一次性完成所有替换操作:

sed -f replace.sed infile.txt 

+ 1,``,其他选项''。将替换文件存储在文件中可能很方便!(我希望我会记住...)
mpy

+1还因为它采用原生功能,而不是一个自定义脚本,所以“其他选项”是更便携/共享
戴维·库克

@DavidCook谢谢,但它不比其他方法更原生或可移植。第一种方法是使用POSIX Shell循环,它与第二种方法一样可移植。由于它使用了shell循环,因此只会慢很多。
terdon

没错,我的意思是sed脚本文件格式更可移植,因为它使用内置的sed功能而不是脚本,而脚本必须与replaces.txt文件共享。但是,它们都是不错的选择!
David Cook
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.