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’

    在一行的后面添加文本。

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

  • ‘c\TEXT’

    用 TEXT 取代行。

  • ’d'

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

  • ‘e’

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

    如 test.sh 脚本中的内容是输出 ‘shell script’ ,‘e’ 命令就是执行脚本后输出执行的结果。

  • ‘e COMMAND’

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

  • ‘F’

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

  • ‘g’

    用空行取代。

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

  • ‘G’

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

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

  • ‘i\TEXT’

    在一行的前面插入文本。

  • ‘l’

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

  • ‘p’

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

  • ‘q[EXIT_CODE]’

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