Stream 编辑器 - 基本命令

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


Delete 删除命令

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

[address1[,address2]]d 

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

顾名思义,delete 命令是用来执行删除操作的,由于 SED 是在线操作的,所以我们可以说这个命令是用来删除行的。 请注意,delete 命令仅从模式缓冲区中删除行; 该行不发送到输出流,原始文件保持不变。 下面的例子说明了这一点。

[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 

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

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

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


Write 命令

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

[address1[,address2]]w file 

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

在上述语法中,w 指的是写入命令,file 是您存储内容的文件名。 小心 file 参数。 提供文件名时,如果文件不存在,SED 会即时创建文件,如果文件已经存在,则将其覆盖。

让我们使用 SED 制作文件的精确副本。 注意 wfile 之间必须有一个空格。

[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 

您还可以在 write 命令中使用逗号 (,)、美元 ($) 和加号 (+) 运算符。

除此之外,SED 还支持使用 write 命令进行模式匹配。 假设您要将各个作者的所有书籍存储到一个单独的文件中。 一种枯燥而冗长的方法是手动完成,而更聪明的方法是使用 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 

Excellent! We got the expected result. SED is really an amazing utility.


Append 命令

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

[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 

Change 命令

SED 提供changereplace 命令,用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 还允许用单行替换多行。 下面的示例删除了从第四行到第六行并用新文本替换它们。

[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

Insert 命令

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

[address]i\ 
Insert text 

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

[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

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


Translate 命令

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

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

请注意,翻译是基于从 list 1 中的字符到 list 2 中相同位置的字符的位置,并且两个列表都必须是明确的字符列表。不支持正则表达式和字符类。 此外,list 1list 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$ 

Quit 命令

Quit 命令指示 SED 退出当前执行流程。 它由 q 命令表示。 以下是 quit 命令的语法:

[address]q 
[address]q [value]

请注意,quit 命令不接受地址范围,它只支持单个地址。 默认情况下,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

Read 命令

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

[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 还接受一系列地址。 例如,以下命令在第三、第四和第五行之后插入 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 命令一样,读取命令也接受模式作为地址。 例如,以下命令在模式匹配成功时插入 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 命令

We 可以使用 execute 命令从 SED 执行外部命令。 它由 e 表示。 下面给出的是执行命令的语法。

[address1[,address2]]e [command]

让我们用一个简单的例子来说明执行命令。 以下 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 之后没有 命令 的情况下,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