Stream 编辑器 - 基本语法

本章介绍 SED 支持的基本命令及其命令行语法。 SED 可以通过以下两种形式调用:

sed [-n] [-e] 'command(s)' files 
sed [-n] -f scriptfile files

第一种形式允许在行内指定命令,它们用单引号括起来。 后者允许指定包含 SED 命令的脚本文件。 但是,我们可以多次同时使用这两种形式。 SED 提供了各种命令行选项来控制其行为。

让我们看看如何指定多个 SED 命令。 SED 提供了 delete 命令来删除某些行。 让我们删除第 1 行、第 2 行和第 5 行。 暂时忽略删除命令的所有细节。 稍后我们将讨论有关删除命令的更多信息。

首先,使用 cat 命令显示文件内容。

[jerry]$ cat books.txt 

执行上述代码,得到如下结果:

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

现在指示 SED 仅删除某些行。 在这里,为了删除三行,我们使用 -e 选项指定了三个单独的命令。

[jerry]$ sed -e '1d' -e '2d' -e '5d' books.txt 

执行上述代码,得到如下结果:

3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
6) A Game of Thrones, George R. R. Martin, 864 

此外,我们可以在一个文本文件中编写多个 SED 命令,并将该文本文件作为参数提供给 SED。 SED 可以在模式缓冲区上应用每个命令。 以下示例说明了 SED 的第二种形式。

首先,创建一个包含 SED 命令的文本文件。 为了便于理解,让我们使用相同的 SED 命令。

[jerry]$ echo -e "1d\n2d\n5d" > commands.txt 
[jerry]$ cat commands.txt

执行上述代码,得到如下结果:

1d 
2d 
5d 

现在指示 SED 从文本文件中读取命令。 在这里,我们实现了与上述示例相同的结果。

[jerry]$ sed -f commands.txt books.txt

执行上述代码,得到如下结果:

3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
6) A Game of Thrones,George R. R. Martin, 864 

标准选项

SED 支持以下标准选项:

  • -n: 模式缓冲区的默认打印。 例如,以下 SED 命令不显示任何输出:

  • [jerry]$ sed -n '' quote.txt 
    
  • -e : 下一个参数是一个编辑命令。 在这里,尖括号表示强制参数。 通过使用此选项,我们可以指定多个命令。 让我们将每一行打印两次:

  • [jerry]$ sed -e '' -e 'p' quote.txt
    

执行上述代码,得到如下结果:

There is only one thing that makes a dream impossible to achieve: the fear of failure. 
There is only one thing that makes a dream impossible to achieve: the fear of failure. 
 - Paulo Coelho, The Alchemist 
 - Paulo Coelho, The Alchemist
  • -f : 下一个参数是一个包含编辑命令的文件。 尖括号表示强制参数。 在下面的例子中,我们通过文件指定打印命令:

[jerry]$ echo "p" > commands 
[jerry]$ sed -n -f commands quote.txt

执行上述代码,得到如下结果:

There is only one thing that makes a dream impossible to achieve: the fear of failure. 
 - Paulo Coelho, The Alchemist

GNU 特定选项

让我们快速浏览一下 GNU 特定的 SED 选项。 请注意,这些选项是 GNU 特定的; SED 的其他变体可能不支持。 在后面的部分中,我们将更详细地讨论这些选项。

  • -n, --quiet, --silent: 与标准 -n 选项相同。

  • -e script, --expression=script: 与标准 -e 选项相同。

  • -f script-file, --file=script-file: 与标准 -f 选项相同。

  • --follow-symlinks: 如果提供此选项,则 SED 在编辑文件时遵循符号链接。

  • -i[SUFFIX], --in-place[=SUFFIX]: 此选项用于就地编辑文件。 如果提供了后缀,则备份原始文件,否则覆盖原始文件。

  • -l N, --line-lenght=N: 此选项将 l 命令的行长设置为 N 个字符。

  • --posix: 此选项禁用所有 GNU 扩展。

  • -r, --regexp-extended: 此选项允许使用扩展正则表达式而不是基本正则表达式。

  • -u, --unbuffered: 提供此选项时,SED 从输入文件加载最少量的数据并更频繁地刷新输出缓冲区。 当您不想等待输出时,它对于编辑"tail -f"的输出很有用。

  • -z, --null-data: 默认情况下,SED 用换行符分隔每一行。 如果提供了 NULL-data 选项,它将用 NULL 字符分隔行。