我有一个 10GB 数据的文件,我想sed -i 's/pattern/replace_pattern/g'
在该文件上执行 2048 个替换表达式。
有没有一种方法可以更快、更有效地做到这一点。
目前,我正在启动sed
或perl
按顺序启动。
sed -i "s/VSS:F31128015/VSS_F31128015/g" file.data
sed -i "s/VSS:F31127969/VSS_F31127969/g" file.data
OR
perl -pi -e 's/VSS\:F31128015/VSS_F31128015/g' file.data
perl -pi -e 's/VSS\:F31127969/VSS_F31127969/g' file.data
我确实注意到执行速度的差异很小perl
,或者sed
是否有更好的方法来做到这一点?我有将近2048个替换表达式。
Tcl/tk
通过并使用打开 10GB 文件regexp
会是一个更好的主意吗?
我应该使用莱克斯?
答案1
一些应该有效的东西(未经测试)
使用更通用的正则表达式
sed -i -e 's/(VSS):(F[0-9]+)/\1_\2/g' file.data
使用多个表达式,但使用一次sed
调用。
sed -i -e "s/VSS:F31128015/VSS_F31128015/g" -e "s/VSS:F31127969/VSS_F31127969/g" file.data
答案2
perl 非常适合像这样的简单文本替换。跟进您对 ctrl-alt-delor 答案的评论线程,有一些方法可以避免贪婪。在这种情况下,您想要精确匹配 8 位数字吗?如果是,
perl -i.bak -pe 's/(?<=VSS):(?=F\d{8})/_/' bigfile
这使用环视来查找要更改为下划线的冒号。
g
即使每行只有 1 个匹配项,人们也经常添加该标志。如果需要的话添加它。