我对 bash 中的 sed 效率有疑问。我有一系列流水线的 sed 语句,例如:
var1="Some string of text"
var2=$(echo "$var1" | sed 's/pattern1/replacement1/g' | sed 's/pattern2/replacement2/g' | sed 's/pattern3/replacement3/g' | sed 's/pattern4/replacement4' | sed 's/pattern5/replacement5/g')
假设没有任何输入依赖于早期 sed 管道的编辑输出,我是否最好改为使用表达式语句编写上述脚本?例如:
var2=$(echo "$var1" | sed -e's/pattern1/replacement1/g' -e's/pattern2/replacement2/g' -e's/pattern3/replacement3/g' -e's/pattern4/replacement4/g' -e's/pattern5/replacement5/g')
这里有什么效率可以提高吗?
最佳答案
简答
使用多个表达式比使用多个管道更快,因为创建管道和 fork sed 进程会产生额外的开销。然而,这在实践中很少有足够大的区别。
基准
使用多个表达式比多个管道更快,但对于一般用例来说可能还不够重要。使用您的示例,执行速度的平均差异仅为千分之二秒,这还不足以令人兴奋。
# Average run with multiple pipelines.
$ time {
echo "$var1" |
sed 's/pattern1/replacement1/g' |
sed 's/pattern2/replacement2/g' |
sed 's/pattern3/replacement3/g' |
sed 's/pattern4/replacement4/g' |
sed 's/pattern5/replacement5/g'
}
Some string of text
real 0m0.007s
user 0m0.000s
sys 0m0.004s
# Average run with multiple expressions.
$ time {
echo "$var1" | sed \
-e 's/pattern1/replacement1/g' \
-e 's/pattern2/replacement2/g' \
-e 's/pattern3/replacement3/g' \
-e 's/pattern4/replacement4/g' \
-e 's/pattern5/replacement5/g'
}
Some string of text
real 0m0.005s
user 0m0.000s
sys 0m0.000s
当然,这不是针对大型输入文件、数千个输入文件进行测试,也不是在具有数万次迭代的循环中运行。不过,可以肯定地说,差异小到与大多数常见情况无关。
不常见的情况是另一回事。在这种情况下,基准测试将帮助您确定用内联表达式替换管道是否是对该用例有值(value)的优化。
关于regex - 流水线 sed 调用和多个 sed 表达式之间的效率是否存在差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11641333/