在一个大文本文件中进行多项搜索和替换操作

SPR*_*BRN 11 linux vim sed find-and-replace

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

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

:%s/www\.abcdef/www.test.abcdef/g 
:%s/www\.klmnop/www.test.klmnop/g
Run Code Online (Sandbox Code Playgroud)

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

sss*_*fff 8

我会像这样使用 sed :

sed -i "s/www\.abcdef/www.test.abcdef/g;s/www\.kmlnop/www.test.klmnop/g;" yourfile.txt
Run Code Online (Sandbox Code Playgroud)

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

  • @rxt 你说 _replace_ 字符串,抱歉,不,你不需要在那里转义它们。 (2认同)

ter*_*don 6

如果您有更多的搜索模式,您可以将它们保存在一个文件中并从那里读取替换。例如,假设这些是以下内容replacements.txt

www\.abcdef www.test.abcdef 
www\.klmnop www.test.klmnop
Run Code Online (Sandbox Code Playgroud)

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

while read from to; do
  sed -i "s/$from/$to/" infile.txt ; 
done < replacements.txt 
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 这假设您的搜索字符串不包含空格,并且任何奇怪的字符都需要在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;
Run Code Online (Sandbox Code Playgroud)

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

sed -f replace.sed infile.txt 
Run Code Online (Sandbox Code Playgroud)