我有一个非常大的文件,其中有多个 sed 命令可以运行,我想避免内存不足错误并节省时间。这些都是等价的吗?
sed -e 'expr1' -e 'expr2' -e 'expr3' file
sed 'expr1;expr2;expr3' file
sed expr1 file | sed expr2 | sed expr3
我的猜测是,通过 (3) 中的管道,每次都单独处理流,因此与仅处理一次的 (2) 相比,它需要 3 倍的时间。但我不确定 sed 内部如何处理 (1)。
最佳答案
首先,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 调用每次都通过 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
.
关于sed - 带有多个表达式的 sed 与带有分号的一个表达式相同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34890378/