为什么是这样
sed -e '/\s.*$/ s///' -e '/\(.*\)/ s//\L\1/' > filename.txt
比这个更快?
sed -e 's/\s.*$//' -e 's/\(.*\)/\L\1/' > filename.txt
当我运行它们时,它们似乎做了几乎相同的事情,但是在幕后真正发生了什么变化使得一个比另一个更快?
更新: 版本:(GNU sed)4.4 输入数据大小:12GB
答案1
的第一次调用sed
是将替换命令 ( s
) 应用于使用正则表达式作为地址范围选择的一组行。
第二次调用应用与第一次相同的替换,但应用于输入数据的所有行,而不使用地址范围。
对 225 MiB 的电子邮件存档进行测试:
$ find . -type f -name "*.gz" -exec zcat {} + | time gsed -e '/\s.*$/ s///' -e '/\(.*\)/ s//\L\1/' >/dev/null
real 1m0,39s
user 0m49,69s
sys 0m10,53s
$ find . -type f -name "*.gz" -exec zcat {} + | time gsed -e 's/\s.*$//' -e 's/\(.*\)/\L\1/' >/dev/null
real 0m40,79s
user 0m34,02s
sys 0m7,85s
我运行了几次。所提供的时间具有代表性。
正如你所看到的,我得到了对面的你声称得到的结果。这可能是数据造成的。sed
在相同的数据上测试 OpenBSD 时得到了类似的结果(使用稍微修改的表达式,因为您的表达式是 GNUsed
特定的),尽管时间差异较小。