sed - 带有多个表达式的 sed 与带有分号的一个表达式相同吗?

标签 sed

我有一个非常大的文件,其中有多个 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' 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 .

    关于sed - 带有多个表达式的 sed 与带有分号的一个表达式相同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34890378/

    相关文章:

    linux - 如何合并文件并搜索结果?

    awk - 根据字段数添加其他字段

    awk - 获取模式匹配前后的所有行,直到出现空行

    linux - 如何选择文件的其余部分,不包括 linux 中的某些行?

    linux - 如何在 linux 中使用 sed 做到这一点?

    mysql - sed -e '/./{H;$!d;}' -e 'x;/CREATE TABLE ` suck_t`/!d;q' bak.sql;这个命令是如何工作的?

    bash - 如何根据匹配的关键字段用另一个文件中的行替换文本文件中的行?

    regex - sed 和 grep 中单词的开头和结尾

    linux - 如何将行插入到不存在字符串的特定文件中?

    linux - sed 解码 html 编码。需要解释如何