Sed 编辑大型文本文件比本机 bash 子字符串替换快得多?

Sed 编辑大型文本文件比本机 bash 子字符串替换快得多?

我有一个 ~19MB 的文本文件,我想对它执行许多查找/替换操作。我最初编写脚本是为了循环执行 sed 操作,例如

sed -i "s|$pattern|$replacement|g" $textfile

在我的情况下,每个操作大约需要 0.5 秒。我认为我可以通过先将文本加载到内存中,然后循环执行原生 bash 子字符串替换来加快速度,例如

 text=$(<$textfile)
 text=${text//$pattern/$replacement}

但令我惊讶的是,每次替换大约需要 7.5 秒(15 倍),不包括初始加载或后续保存。为什么 sed 比原生 bash 字符串替换快这么多?我最终使用了

text=$(sed "s|$pattern|$replacement|g" <<< "$text")

这比每次直接执行 sed 快约 20%,但再次让我感到惊讶的是 ${text//$pattern/$replacement} 的速度如此之慢。根本无法与之匹敌。有没有更高效的语法?我使用的是 GNU bash 5.1.16(1)。

相关内容