我有一个很大的文本文件(大约 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