使用更通用的正则表达式

使用更通用的正则表达式

我有一个 10GB 数据的文件,我想sed -i 's/pattern/replace_pattern/g'在该文件上执行 2048 个替换表达式。

有没有一种方法可以更快、更有效地做到这一点。

目前,我正在启动sedperl 按顺序启动。

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 个匹配项,人们也经常添加该标志。如果需要的话添加它。

相关内容