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

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

我有一个很大的文本文件(大约 2GB)。我想对同一个文件执行五次搜索和替换操作,并希望在一个命令中完成这些操作。通常我使用 vim,打开文件,执行一次替换操作,然后执行下一个,等等。有一个问题,因为我注意到在三四次搜索之后,vim 会因为内存问题而崩溃。

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

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

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

答案1

我会像这样使用 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 )。

答案2

如果您有更多搜索模式,您可以将它们保存在文件中并从中读取替换。例如,假设这些是的内容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 

相关内容