sed 命令

简介

sed 是一个按行处理基本文本的流式处理命令,stream editor 的缩写。它每次只能处理输入文本中的一行,输入的文本可以来自文件或者管道。 sed 常常用于过滤输入的文本,快速的替换等。具体看下面的讲解。

sed 的使用格式

基本格式

sed 使用的基本格式是:

sed OPTIONS… [SCRIPT] [INPUTFILE]

第二个位置是各种选项,SCRIPT 表示对输入处理的脚本,最后是输入文件,如果输入文件为 - ,表示标准输入(stdin),一般指终端输入。

调用选项

  • -n

    默认情况下,sed 会输出它处理每一行后的结果,这个选项就是用于禁止输出。

    上图中第一个命令是显示 test.txt 中的内容,这里只有一行 hello world! 。这个第二个命令中 p 是一个打印(print)命令,表示把内容打印出来。实际上打印了两行,就是因为 sed 处理 p 命令后会把处理的结果输出,处理的命令又是打印命令,所以会输出两行。第三个命令加上 -n 选项后,就不会输出处理结果,所以只有一行,就是 p 命令处理的行。

  • -e SCRIPT

    这个选项能够对同一个输入运行多次命令。每个命令用 -e SCRIPT 。如下图:

    上面使用两个 p 命令输出两次。

  • -f SCRIPT-FILE

    对输入处理的命令写在指定的文件中,如把上面的 p 写入文件中。如下图:

    第一个命令就是显示 SCRIPT-FILE 文件里的内容,只有一个 p 字符。

  • -i[SUFFIX]

    sed 在处理过程中会创建一个临时文件,把处理后结果输出到这个文件中而不是终端中。处理完成后,sed 会把临时文件重命名为原来输入文件的名字。即如果没有 SUFFIX , sed 会直接覆盖掉原来的文件且不会备份,如果有 SUFFIX ,sed 就会备份原来的文件,备份后的文件名就是原来的文件名加上 SUFFIX ,然后在把处理后的文本写入原文件。

    上图中第一个没有加 SUFFIX ,就没有备份文件,第二个加上 ‘-bak’,就把原文件备份到 ’test.txt-bak’文件中。

  • --follow-symlinks

    -i 一起使用可以直接修改符号链接指向的文件,否则就会直接修改符号链接。

  • -E -r

    用扩展的正则表达式代替基本的正则表达式,不同之处参见正则表达式的相关知识。

  • -s

    默认 sed 把指定文件当成一个单一的连续的字符流, -s 选项能够把它当成一个分隔的文件,暂时没用到过。

退出状态

sed 返回 0 表示处理成功,非 0 表示失败。返回 1 表示格式无效,返回 2 表示输入文件无法打开,返回 4 表示 IO 错误。可以用于脚本中的判断。

sed 的处理脚本语法(SCRIPT)

sed 命令语法

sed 中的脚本部分又称为命令(command),它的语法如下:

[addr]X[options]

X 是一个单个字符的 sed 命令,如上面用到的 p 命令。addr 可选的行的地址,如果指定了 addr,那么命令 X 只会在那些匹配 addr 的行执行。addr 可以是一个单一的行号,行的范围或者正则表达式。

上面的图中,第一个是带行号输出 test.txt 中的内容,第二个中 2,4d 表示删除 2-4 行中的内容,输出就没有 2-4 行了, d 表示删除。

sed 中的常用命令,即上面的 X

  • a\TEXT

    在一行的后面添加 TEXT

    上面就是在一行的后面添加了文本。

  • c\TEXT

    TEXT 取代行。

  • d

    删除行,如上面 sed 命令语法中的例子。

  • e

    执行输入文件,把执行结果作为输出。

    如 test.sh 脚本中的内容是输出 shell scripte 命令就是执行脚本后输出执行的结果。

  • e COMMAND

    执行 COMMAND 命令,把结果作为输出。

  • F

    把当前文件的名称打印出来。

  • g

    用空行取代。

    上面就是把第五行用空行取代。

  • G

    在每一行下面添加一个空行。

    每一行下面都添加了空行。

  • i\TEXT

    在一行的前面插入文本。

  • l

    打印一行,在行的最后加上

  • p

    打印命令,上面已经有很多例子了。

  • q[EXIT_CODE]

    满足退出条件(EXIT_CODE)时退出处理。