【问题标题】:Is sed with multiple expressions the same as one expression with semi-colons?带有多个表达式的 sed 是否与带有分号的一个表达式相同?
【发布时间】:2016-04-17 13:13:53
【问题描述】:

我有一个非常大的文件,需要在其上运行多个 sed 命令,我想避免内存不足错误并节省时间。这些都是等价的吗?

  1. sed -e 'expr1' -e 'expr2' -e 'expr3' file
  2. sed 'expr1;expr2;expr3' file
  3. sed expr1 file | sed expr2 | sed expr3

我的猜测是,使用 (3) 中的管道,每次都单独处理流,因此与仅处理一次的 (2) 相比,它需要 3 倍的时间)。但我不确定 sed 如何在内部处理 (1)。

【问题讨论】:

  • 你猜对了,1和2一样。
  • @BenjaminW.maybe 写一个答案来解释你是怎么知道的?
  • -e 选项还会导致命令以换行符结束,允许命令 i,c,a 以及以文件名结尾的命令,例如 w,@ 987654329@,rR 内联写入。另一种用途是与-f 选项结合使用时作为包处理程序,即可以插入包含s/5/Z/ 的文件A:seq 20| sed -e '10,20{' -f fileA -e '}' ,第15 行变为1Z

标签: sed


【解决方案1】:

首先,sed -e 'expr1' -e 'expr2' filesed 'expr1;expr2' file 完全相同。也等价于

sed 'expr1
expr2' file

和存储

expr1
expr2

(或expr1;expr2)在文件中,例如sedscr并用sed -f sedscr file调用它,或者最终存储

/usr/bin/sed -f

expr1
expr2

在文件sedscr 中并使用./sedscr file 调用它。

对于每个输入行,sed 会遍历完整的脚本并将所有命令应用于它,然后转到下一个输入行。

另一方面,管道 sed 调用每次都会 sed 遍历整个文件(并为每个调用创建一个子 shell)。如果您对每一行都进行操作,这可能不会有很大的不同,但想象一下相互依赖的替换链,例如文件

xx
xx
pattern
xx
xx
PATTERN
xx
xx

并且您希望以不区分大小写的方式以大写的PATTERN 结尾,无论您在哪里找到它。如果您像中一样使用管道

sed 's/pattern/PATTERN/' infile | sed 's/PATTERN/(&)/'

您对文件进行两次总共三个操作:

Initial  1st pass 2nd pass
xx       xx       xx
xx       xx       xx
pattern  PATTERN  (PATTERN)
xx       xx       xx
xx       xx       xx
PATTERN  PATTERN  (PATTERN)
xx       xx       xx
xx       xx       xx

但有

sed 's/pattern/PATTERN/;s/PATTERN/(&)/' infile

您只需通过一次即可获得相同的结果。所以,无论如何,试着把所有东西都塞进一个命令中。

GNU sed 可以在一个命令中完成:sed 's/pattern/\U(&)/' infile

【讨论】:

  • 我不确定如果您的第一个表达式使用多行会发生什么,但我想这是使用管道的好时机。感谢您的详细回答!
  • @pfctdayelise 你有第一个表达式的例子吗? Sed 可以通过一些保持空间技巧一次完成几乎任何事情。 (不过,通常使用 awk 会容易得多。)
  • 类似 expr1 的东西:如果 '^foo$' 后跟 '^bar$',则将 foo 替换为 baz; expr2: s/bar/BAR/g 'foo' 之后的一行 'bar' 是否被第一个 exp2 “消耗”了?
  • @pfctdayelise 所有执行的命令都适用于当前的模式空间,所以答案是“是的,除非你不想要它”。还有“如果有替换则分支”(t)或“如果模式空间匹配某些东西则分支”(/pattern/b)的命令,您可以引入标签跳转到...查看@987654321 @ 在 sed 手册中,或者更疯狂的东西,有 Sokoban in sed...
猜你喜欢
  • 2012-03-28
  • 1970-01-01
  • 2021-08-27
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
  • 1970-01-01
  • 2020-05-21
相关资源
最近更新 更多