我有2个在别处生成的文件。第一个是“搜索什么”,第二个是替换。这两个文件都很庞大,每个文件大约2-3mb。
我需要编写一个bash脚本,它需要一个更大的文件(大约200-300mb)并将所有出现的file1内容替换为file2内容。
问题是,file1和file2可以包含任何可能的字符,包括正则表达式特殊符号。
如何使用sed解决此问题?
提前致谢。
答案 0 :(得分:1)
由于你实际上并不需要正则表达式,只是直接字符串匹配,sed
是过度的。你真正想要的是一个固定字符串(甚至可能是二进制)流编辑器。不幸的是,我不知道一个...我讨厌建议可能重新发明一个轮子,但你可以在C中写一些能够做你想做的事情。粗略草案大纲:
您还可以尝试自动转义输入文件中的所有正则表达式字符。这可以通过一个非常难看的sed
替换列表来完成,比如
sed -e 's/\\/\\\\/g' -e 's@/@\/@' -e 's/\[/\\[/g' ...
(确保先进行\
一次!)
答案 1 :(得分:1)
答案 2 :(得分:0)
我不知道sed,但在Perl中你可以做到(在我的头顶,未经测试):
perl -0777 -pe 'BEGIN{local $/ = undef; open FROM, "<", shift @ARGV; $from = <FROM>; open TO, "<" shift @ARGV; $to = <TO>} s/\Q$from\E/$to/sog' file1 file2 bigger-file > new-bigger-file
如果你有兴趣尝试Perl,我明天可以尝试为你测试。
但它将整个较大的文件吸收到内存中,因为它忽略了换行符,因此您的搜索文本可以跨越多行。这意味着它会占用大量内存!
此答案假定搜索文件是多行上的一个长搜索字符串,必须完整匹配,而不是多个单独的搜索字符串,其中任何一个都可以匹配。