多个 sed 命令:当分号时,当管道时?

Cam*_*une 1 bash sed pipe

当我在 sed 中构造一个复杂的操作时,我经常从

cat infile | sed 'expression1' | sed 'expr2' ...
Run Code Online (Sandbox Code Playgroud)

然后将其优化为

cat infile | sed 'expr1;expr2;expr3' | sed 'expr4' | sed 'expr5;expr6' ...
Run Code Online (Sandbox Code Playgroud)

对于哪些表达式可以与分号组合成单个命令,有哪些指导原则?到目前为止,我只是临时组合s///,而不是组合//d

(优化是为了运行它数千万次。是的,它明显更快。)

(发布在这里而不是在 superuser.com 上,因为那里关于 sed 的问题少了 20 倍。)

Tom*_*ech 5

您正在执行的操作在每种情况下都完全不同。

当您使用管道“组合” sed 命令时,每次调用 sed 都会处理整个文件。这会产生为管道的每个部分启动单独流程的成本。

当您使用以分号分隔的命令列表时,每个命令将依次应用于文件中的每一行,使用 sed 的单个实例。

根据您使用的命令,这两件事的输出可能会有很大不同!

如果您不喜欢使用分号来分隔命令,我会建议另一种选择:使用sed -e 'expr1' -e 'expr2' -e 'expr3' file. 或者,包括 sed 在内的许多工具都支持-f传递包含命令的文件。为了清楚起见,您可以将每个命令放在换行符上,而不是使用分号。