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

时间:2016-08-08 16:01:09

标签: bash sed pipe

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

开头
cat infile | sed 'expression1' | sed 'expr2' ...

然后将其优化为

cat infile | sed 'expr1;expr2;expr3' | sed 'expr4' | sed 'expr5;expr6' ...

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

(优化是为了运行数千万次。是的,它是measurably faster。)

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

4 个答案:

答案 0 :(得分:3)

您执行的操作在每种情况下都是根本不同的。

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

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

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

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

答案 1 :(得分:2)

通常,sd可以和平共处。当不同的命令相互交互时,您可能需要分解并使用单独的脚本,或者使用变量等切换到更丰富的语言。

例如,一个sed脚本可以将数千个分隔符添加到缺少它们的数字中,这些脚本可能与其他处理完全分开。从长远来看,模块化可能比任何可能的效率提升更重要。

答案 2 :(得分:1)

最好避免使用

多个sed
sed -f mycmd.awk

mycmd.awk将包含每个sed命令的位置单独列出。

根据man sed

  

-f command_file
  将命令文件中的编辑命令附加到命令列表中。编辑命令应各自列在单独的一行。

答案 3 :(得分:1)

  

哪些表达式可以与分号组合成单个命令?到目前为止,我只是特意组合s ///,而不是组合// d。

sed拥有的命令多于sd。但是,如果这些是您正在使用的唯一的,那么您可以在同一sed次运行中加入任意数量的人。结果与多个单命令sed的管道相同。但是,如果您要这样做,则考虑使用命令文件,如@anubhava建议的那样,或者通过自己的-e参数给出每个独立的表达式;任何一个都比由多个以分号分隔的命令组成的单个表达式更清晰。

即使您使用其他命令,在大多数情况下,通过单个sed进程执行一系列命令也会得到相同的结果,就像通过单独的{以相同的顺序执行相同的命令一样{1}}进程。我能想到的主要例外涉及必须相互依赖的命令,例如标签和分支;命令操纵保持空间及其周围的空间;在大括号内分组的命令(sed);以及{}下的p命令。

据说,sed -n程序非常快速地变得非常神秘。如果你正在编写一个复杂的转换,那么请考虑仔细考虑@ EdMorton的建议并将整个事件编写为(单个)sed程序而不是一个或多个awk程序。< / p>

相关问题