流编辑器 - 基本命令



本章介绍几个有用的 SED 命令。

删除命令

SED 提供各种命令来操作文本。让我们首先探索一下**删除**命令。以下是执行删除命令的方法

[address1[,address2]]d 

**address1** 和 **address2** 分别是起始和结束地址,可以是行号或模式字符串。这两个地址都是可选参数。

顾名思义,删除命令用于执行删除操作,并且由于 SED 对行进行操作,因此可以说此命令用于删除行。请注意,删除命令仅从模式缓冲区中删除行;该行不会发送到输出流,并且原始文件保持不变。以下示例说明了这一点。

[jerry]$ sed 'd' books.txt 

但是输出在哪里?如果未提供行地址,则 SED 默认对每一行进行操作。因此,它会删除模式缓冲区中的所有行。这就是为什么该命令不会在标准输出上打印任何内容的原因。

让我们指示 SED 仅对某些行进行操作。以下示例仅删除第 4 行。

[jerry]$ sed '4d' 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 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

此外,SED 还接受使用逗号 (,) 的地址范围。我们可以指示 SED 删除 N1 到 N2 行。例如,以下示例删除第 2 到第 4 行的所有行。

[jerry]$ sed '2, 4 d' books.txt 

执行上述代码后,您将获得以下结果

1) A Storm of Swords, George R. R. Martin, 1216 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

SED 的地址范围不仅限于数字。我们还可以将模式指定为地址。以下示例删除作者 Paulo Coelho 的所有书籍。

[jerry]$ sed '/Paulo Coelho/d' books.txt 

执行上述代码后,您将获得以下结果

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
6) A Game of Thrones, George R. R. Martin, 864 

我们还可以使用文本模式指定地址范围。以下示例删除**Storm** 和**Fellowship** 模式之间的所有行。

[jerry]$ sed '/Storm/,/Fellowship/d' books.txt  
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864 

除此之外,我们还可以将美元符号 ($) 、加号 (+) 和波浪号 (~) 运算符与 SED 一起使用。

写入命令

我们在任何文件上执行的一个重要操作是备份,即我们制作文件的另一个副本。SED 提供**写入**命令将模式缓冲区的内容存储到文件中。下面给出的是**写入**命令的语法,它类似于**删除**命令。

[address1[,address2]]w file 

这里,**address1** 和 **address2** 分别是起始和结束地址,可以是行号或模式字符串。这两个地址都是可选参数。

在上述语法中,**w** 指的是写入命令,**file** 是您存储内容的文件名。请注意**file** 参数。当提供文件名时,如果文件不存在,则 SED 会动态创建该文件,如果文件已存在,则会覆盖该文件。

让我们使用 SED 创建文件的精确副本。请注意,**w** 和**file** 之间必须正好有一个空格。

[jerry]$ sed -n 'w books.bak' books.txt 

我们创建了另一个名为**books.bak** 的文件。现在验证这两个文件是否具有相同的内容。

[jerry]$ diff books.txt books.bak  
[jerry]$ echo $?

执行上述代码后,您将获得以下结果

0

您可以假设**cp** 命令执行完全相同的事情。是的!**cp** 命令执行相同的事情,但 SED 是一个成熟的实用程序。它允许创建仅包含源文件中某些行的文件。让我们将偶数行存储到另一个文件中。

[jerry]$ sed -n '2~2 w junk.txt' books.txt  
[jerry]$ cat junk.txt 

执行上述代码后,您将获得以下结果

2) The Two Towers, J. R. R. Tolkien, 352 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
6) A Game of Thrones, George R. R. Martin, 864 

您还可以将逗号 (,) 、美元符号 ($) 和加号 (+) 运算符与写入命令一起使用。

除此之外,SED 还支持模式匹配与写入命令。假设您想将各个作者的所有书籍存储到单独的文件中。一种乏味且冗长的方式是手动执行此操作,而更智能的方式是使用 SED。

[jerry]$ sed -n -e '/Martin/ w Martin.txt' -e '/Paulo/ w Paulo.txt' -e '/Tolkien/ w 
Tolkien.txt' books.txt 

在上面的示例中,我们正在将每一行与模式进行匹配,并将匹配的行存储到特定文件中。这非常简单。为了指定多个命令,我们使用了 SED 命令的**-e** 开关。现在让我们看看每个文件包含什么内容

[jerry]$ cat Martin.txt

执行上述代码后,您将获得以下结果

1) A Storm of Swords, George R. R. Martin, 1216 
6) A Game of Thrones, George R. R. Martin, 864

让我们显示文件内容。

[jerry]$ cat Paulo.txt

执行上述代码后,您将获得以下结果

3) The Alchemist, Paulo Coelho, 197 
5) The Pilgrimage, Paulo Coelho, 288 

让我们显示文件内容。

[jerry]$ cat Tolkien.txt

执行上述代码后,您将获得以下结果

2) The Two Towers, J. R. R. Tolkien, 352 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 

太棒了!我们得到了预期的结果。SED 确实是一个很棒的实用程序。

追加命令

任何文本编辑器最有用的操作之一是提供追加功能。SED 通过其追加命令支持此操作。下面给出的是追加命令的语法

[address]a\ 
Append text 

让我们在第 4 行之后追加一个新的书籍条目。以下示例显示了如何执行此操作

[jerry]$ sed '4 a 7) Adultry, Paulo Coelho, 234' 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 
7) Adultry, Paulo Coelho, 234 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

在命令部分,**4** 表示行号,**a** 是追加命令,其余部分是要追加的文本。

让我们在文件末尾插入一行文本。为此,请使用**$** 作为地址。以下示例说明了这一点

[jerry]$ sed '$ a 7) Adultry, Paulo Coelho, 234' 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 
7) Adultry, Paulo Coelho, 234 

除了行号之外,我们还可以使用文本模式指定地址。例如,以下示例在匹配字符串**The Alchemist** 后追加文本。

[jerry]$ sed '/The Alchemist/ a 7) Adultry, Paulo Coelho, 234' 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 
7) Adultry, Paulo Coelho, 234 
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 

请注意,如果有多个匹配的模式,则文本将在每次匹配后追加。以下示例说明了这种情况。

[jerry]$ sed '/The/ a 7) Adultry, Paulo Coelho, 234' books.txt 

执行上述代码后,您将获得以下结果

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

更改命令

SED 提供**更改**或**替换**命令,用 c 表示。此命令有助于用新文本替换现有行。当提供行范围时,所有行都作为一个组被单个文本行替换。下面给出的是更改命令的语法

[address1[,address2]]c\ 
Replace text

让我们用其他一些文本替换第三行。

[jerry]$ sed '3 c 3) Adultry, Paulo Coelho, 324' books.txt

执行上述代码后,您将获得以下结果

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) Adultry, Paulo Coelho, 324 
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 还接受模式作为地址。在以下示例中,当模式匹配成功时替换一行。

[jerry]$ sed '/The Alchemist/ c 3) Adultry, Paulo Coelho, 324' books.txt

执行上述代码后,您将获得以下结果

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) Adultry, Paulo Coelho, 324 
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 还允许用一行替换多行。以下示例删除第 4 到第 6 行,并用新文本替换它们。

[jerry]$ sed '4, 6 c 4) Adultry, Paulo Coelho, 324' 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) Adultry, Paulo Coelho, 324

插入命令

插入命令的工作方式与追加命令非常相似。唯一的区别在于它在特定位置之前插入一行。下面给出的是插入命令的语法

[address]i\ 
Insert text 

让我们通过一些示例来了解插入命令。以下命令在第 4 行之前插入一个新条目。

[jerry]$ sed '4 i 7) Adultry, Paulo Coelho, 324' 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 
7) Adultry, Paulo Coelho, 324 
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

在上面的示例中,**4** 是位置编号,**i** 表示插入命令,其余部分是要插入的文本。

要在文件开头插入文本,请将行地址提供为**1**。以下命令说明了这一点

[jerry]$ sed '1 i 7) Adultry, Paulo Coelho, 324' books.txt

执行上述代码后,您将获得以下结果

7) Adultry, Paulo Coelho, 324 
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

此外,我们可以插入多行。以下命令在最后一行之前插入两行。

[jerry]$ sed '$ i 7) Adultry, Paulo Coelho, 324

执行上述代码后,您将获得以下结果

8) Eleven Minutes, Paulo Coelho, 304' 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 
7) Adultry, Paulo Coelho, 324 
8) Eleven Minutes, Paulo Coelho, 304 
6) A Game of Thrones, George R. R. Martin, 864

请注意,要插入的条目在单独的行上输入,并以反斜杠 (\) 字符分隔。

转换命令

SED 提供一个转换字符的命令,它表示为**y**。它按位置转换字符。下面给出的是转换命令的语法

[address1[,address2]]y/list-1/list-2/

请注意,转换基于字符在**list 1** 中的位置到字符在**list 2** 中相同位置的字符,并且这两个列表都必须是显式字符列表。不支持正则表达式和字符类。此外,**list 1** 和**list 2** 的大小必须相同。

以下示例将阿拉伯数字转换为罗马数字。

[jerry]$ echo "1 5 15 20" | sed 'y/151520/IVXVXX/' 

执行上述代码后,您将获得以下结果

I V IV XX 

l 命令

您能否仅通过查看它们来区分以空格分隔的单词和仅以制表符分隔的单词?当然不行。但是 SED 可以为您做到这一点。SED 使用**l** 命令显示文本中的隐藏字符。例如,制表符用**\t** 表示,行尾用**$** 字符表示。下面给出的是**l** 命令的语法。

[address1[,address2]]l 
[address1[,address2]]l [len] 

让我们创建一个包含制表符的文件进行演示。为简单起见,我们将使用同一个文件,只是用制表符替换空格。等等!但是如何做到这一点——通过在文本编辑器中打开文件并将每个空格替换为制表符?当然不行!我们可以利用 SED 命令来做到这一点。

[jerry]$ sed 's/ /\t/g' books.txt > junk.txt 

现在让我们使用**l** 命令显示隐藏字符

[jerry]$ sed -n 'l' junk.txt

执行上述代码后,您将获得以下结果

1)\tA\tStorm\tof\tSwords,George\tR.\tR.\tMartin,1216$ 
2)\tThe\tTwo\tTowers,J.\tR.\tR.\tTolkien,352$ 
3)\tThe\tAlchemist,Paulo\tCoelho,197$ 
4)\tThe\tFellowship\tof\tthe\tRing,J.\tR.\tR.\tTolkien,432$ 
5)\tThe\tPilgrimage,Paulo\tCoelho,288$ 
6)\tA\tGame\tof\tThrones,George\tR.\tR.\tMartin\t,864$

与其他 SED 命令一样,它也接受行号和模式作为地址。您可以自己尝试一下。

让我们仔细看看 SED 的另一个有趣功能。我们可以指示 SED 在特定数量的字符后执行换行。以下示例在 25 个字符后换行。

[jerry]$ sed -n 'l 25' books.txt

执行上述代码后,您将获得以下结果

1) A Storm of Swords,Geo\ 
rge R. R. Martin,1216$ 
2) The Two Towers,J. R. \ 
R. Tolkien,352$ 
3) The Alchemist,Paulo C\ 
oelho,197$ 
4) The Fellowship of the\ 
 Ring,J. R. R. Tolkien,4\ 
32$ 
5) The Pilgrimage,Paulo \ 
Coelho,288$ 
6) A Game of Thrones,Geo\ 
rge R. R. Martin ,864$

请注意,在上面的示例中,换行限制是在 l 命令之后提供的。在这种情况下,它是 25 个字符。此选项是 GNU 特定的,可能不适用于其他版本的 SED。

换行限制为 0 表示除非有换行符,否则永远不会换行。以下简单命令说明了这一点。

[jerry]$ sed -n 'l 0' 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 退出当前执行流程。它由**q** 命令表示。下面给出的是退出命令的语法

[address]q 
[address]q [value]

请注意,退出命令不接受地址范围,它只支持单个地址。默认情况下,SED 遵循读取、执行和重复工作流程;但是,当遇到退出命令时,它会简单地停止当前执行。

让我们打印文件中的前 3 行。

[jerry]$ sed '3 q' 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

除了行号之外,我们还可以使用文本模式。以下命令在模式匹配成功时退出。

[jerry]$ sed '/The Alchemist/ q' 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

除此之外,SED 还可以接受一个**value**,它可以用作退出状态。以下命令将其退出状态显示为 100。

[jerry]$ sed '/The Alchemist/ q 100' 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

现在让我们验证退出状态。

[jerry]$ echo $? 

执行上述代码后,您将获得以下结果

100

读取命令

我们可以指示 SED 读取文件的内容并在特定条件匹配时显示它们。该命令由字母**r** 表示。下面给出的是读取命令的语法。

[address]r file

请注意,**r** 命令和文件名之间必须正好有一个空格。

让我们用一个简单的例子来理解它。创建一个名为**junk.txt** 的示例文件。

[jerry]$ echo "This is junk text." > junk.txt 

以下命令指示 SED 读取**junk.txt** 的内容并在第三行之后插入它们。

[jerry]$ sed '3 r junk.txt' 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 
This is junk text. 
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

在上面的示例中,3 表示行地址,**r** 是命令名称,**junk.txt** 是要显示其内容的文件名。此外,GNU SED 还接受地址范围。例如,以下命令在第 3、第 4 和第 5 行之后插入**junk.txt** 的内容。

[jerry]$ sed '3, 5 r junk.txt' 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 
This is junk text. 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
This is junk text. 
5) The Pilgrimage, Paulo Coelho, 288 
This is junk text. 
6) A Game of Thrones, George R. R. Martin, 864

与其他 SED 命令一样,read 命令也接受模式作为地址。例如,以下命令在模式匹配成功时插入junk.txt的内容。

[jerry]$ sed '/Paulo/ r junk.txt' 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 
This is junk text. 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
This is junk text. 
6) A Game of Thrones, George R. R. Martin, 864 

执行命令

我们可以使用execute命令从 SED 中执行外部命令。它由e表示。以下是 execute 命令的语法。

[address1[,address2]]e [command]

让我们用一个简单的例子来说明 execute 命令。以下 SED 命令在第三行之前执行 UNIX date 命令。

[jerry]$ sed '3 e date' books.txt

执行上述代码后,您将获得以下结果

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
Sun Sep  7 18:04:49 IST 2014 
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

与其他命令一样,它也接受模式作为地址。例如,以下示例在模式匹配成功时执行date命令。请注意,在每次模式匹配后,首先执行命令,然后显示模式缓冲区的内容。

[jerry]$ sed '/Paulo/ e date' books.txt 

执行上述代码后,您将获得以下结果

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

如果您仔细观察e命令的语法,您会注意到command是可选的。当在e之后没有提供命令时,它将模式缓冲区的内容视为外部命令。为了说明这一点,让我们创建一个包含一些简单命令的commands.txt文件。

[jerry]$ echo -e "date\ncal\nuname" > commands.txt 
[jerry]$ cat commands.txt

执行上述代码后,您将获得以下结果

date 
cal 
uname

文件中的命令不言自明。在e之后没有command的情况下,SED会依次执行所有这些命令。以下简单示例说明了这一点。

[jerry]$ sed 'e' commands.txt 

执行上述代码后,您将获得以下结果

Sun Sep  7 18:14:20 IST 2014 
   September 2014      
Su Mo Tu We Th Fr Sa   
    1  2  3  4  5  6   
 7  8  9 10 11 12 13   
14 15 16 17 18 19 20   
21 22 23 24 25 26 27   
28 29 30               
                       
Linux 

与其他 SED 命令一样,execute 命令也接受所有有效的地址范围。

杂项命令

默认情况下,SED 对单行进行操作,但它也可以对多行进行操作。多行命令用大写字母表示。例如,与n命令不同,N命令不会清除和打印模式空间。相反,它在当前模式空间的末尾添加一个换行符(\n),并将输入文件中的下一行追加到当前模式空间,并通过执行其余的 SED 命令继续 SED 的标准流程。以下是N命令的语法。

[address1[,address2]]N

让我们打印一个书籍标题及其各自作者的逗号分隔列表。以下示例说明了这一点。

[jerry]$ sed 'N; s/\n/, /g' books.txt 

执行上述代码后,您将获得以下结果

A Storm of Swords, George R. R. Martin 
The Two Towers, J. R. R. Tolkien 
The Alchemist, Paulo Coelho 
The Fellowship of the Ring, J. R. R. Tolkien 
The Pilgrimage, Paulo Coelho 
A Game of Thrones, George R. R. Martin

让我们了解上面示例的工作原理。N命令将第一行,即A Storm of Swords读入模式缓冲区,并在其后追加\n以及下一行。模式空间现在包含A Storm of Swords\nGeorge R. R. Martin。在下一步中,我们用逗号替换换行符。

p命令类似,我们有一个P命令来打印由N命令创建的多行模式空间的第一部分(直到嵌入的换行符)。以下是P命令的语法,它与p命令类似。

[address1[,address2]]P 

在前面的示例中,我们看到N命令创建了一个换行符分隔的书籍标题及其作者列表。让我们仅打印它的第一部分,即仅打印书籍的标题。以下命令说明了这一点。

[jerry]$ sed -n 'N;P' books.txt

执行上述代码后,您将获得以下结果

A Storm of Swords 
The Two Towers 
The Alchemist 
The Fellowship of the Ring 
The Pilgrimage 
A Game of Thrones

请注意,在没有N的情况下,它的行为与p命令相同。以下简单命令说明了这种情况。

[jerry]$ sed -n 'P' books.txt

执行上述代码后,您将获得以下结果

A Storm of Swords 
George R. R. Martin 
The Two Towers 
J. R. R. Tolkien 
The Alchemist 
Paulo Coelho 
The Fellowship of the Ring 
J. R. R. Tolkien 
The Pilgrimage 
Paulo Coelho 
A Game of Thrones 
George R. R. Martin

除此之外,SED 还提供了一个v命令来检查版本。如果提供的版本大于已安装的 SED 版本,则命令执行将失败。请注意,此选项是 GNU 特定的,可能不适用于其他 SED 变体。以下是v命令的语法。

[address1[,address2]]v [version]

首先,找出 SED 的当前版本。

[jerry]$ sed --version 

执行上述代码后,您将获得以下结果

sed (GNU sed) 4.2.2 

在以下示例中,SED 版本大于版本 4.2.2,因此 SED 命令中止其执行。

[jerry]$ sed 'v 4.2.3' books.txt 

执行上述代码后,您将获得以下结果

sed: -e expression #1, char 7: expected newer version of sed

但是,如果提供的版本小于或等于版本 4.2.2,则命令按预期工作。

[jerry]$ sed 'v 4.2.2' books.txt

执行上述代码后,您将获得以下结果

A Storm of Swords 
George R. R. Martin 
The Two Towers 
J. R. R. Tolkien 
The Alchemist 
Paulo Coelho 
The Fellowship of the Ring 
J. R. R. Tolkien 
The Pilgrimage 
Paulo Coelho 
A Game of Thrones George R. R. Martin
广告