sed的多个表达式与一个带冒号的表达式相同吗?

时间:2016-01-20 02:13:00

标签: sed

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

  1. sed -e 'expr1' -e 'expr2' -e 'expr3' file
  2. sed 'expr1;expr2;expr3' file
  3. sed expr1 file | sed expr2 | sed expr3
  4. 我的猜测是,对于(3)中的管道,每次都会单独处理流,因此与(2)仅处理一次相比,它将花费3倍的时间。但我不确定内部如何处理(1)。

1 个答案:

答案 0 :(得分:2)

首先,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调用每次都会遍历整个文件(并为每个调用创建一个子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