我有一个非常大的文件,上面有多个 sed 命令可以运行,我想避免内存不足错误并节省时间。这些都是等价的吗?
sed -e 'expr1' -e 'expr2' -e 'expr3' filesed 'expr1;expr2;expr3' filesed 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
Run Code Online (Sandbox Code Playgroud)
和存储
expr1
expr2
Run Code Online (Sandbox Code Playgroud)
(或expr1;expr2) 在一个文件中,例如,sedscr并用 调用它sed -f sedscr file,或者最终存储
/usr/bin/sed -f
expr1
expr2
Run Code Online (Sandbox Code Playgroud)
在一个文件中sedscr并用./sedscr file.
对于每个输入行,sed 会遍历完整的脚本并将所有命令应用于它,然后转到下一个输入行。
另一方面,管道 sed 调用每次都通过 sed 遍历整个文件(并为每个调用创建一个子shell)。如果你对每一行都做一个操作,这可能不会有太大的不同,但是想象一下一个相互依赖的替换链,比如一个文件
xx
xx
pattern
xx
xx
PATTERN
xx
xx
Run Code Online (Sandbox Code Playgroud)
并且您希望以不区分大小写的方式将大写字母PATTERN放在括号中,无论您在哪里找到它。如果你像这样使用管道
sed 's/pattern/PATTERN/' infile | sed 's/PATTERN/(&)/'
Run Code Online (Sandbox Code Playgroud)
您对文件进行了两次总共三个操作:
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
Run Code Online (Sandbox Code Playgroud)
但与
sed 's/pattern/PATTERN/;s/PATTERN/(&)/' infile
Run Code Online (Sandbox Code Playgroud)
您只需通过一次即可获得相同的结果。因此,无论如何,尝试将所有内容都塞进一个命令中。
GNU sed 可以在一个命令中完成:sed 's/pattern/\U(&)/' infile.