我有一个非常大的文件,在其上运行多个sed命令,我想避免内存不足错误并节省时间。这些都是等价的吗?
sed -e 'expr1' -e 'expr2' -e 'expr3' file
sed 'expr1;expr2;expr3' file
sed expr1 file | sed expr2 | sed expr3
我的猜测是,对于(3)中的管道,每次都会单独处理流,因此与(2)仅处理一次相比,它将花费3倍的时间。但我不确定内部如何处理(1)。
答案 0 :(得分:2)
首先,sed -e 'expr1' -e 'expr2' file
与sed '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
。