Sed - 基本命令

  • 简述

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

    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 中使用美元 ($)、加号 (+) 和波浪号 (~) 运算符。
  • 写命令

    我们对任何文件执行的重要操作之一是备份,即我们制作文件的另一个副本。SED 提供write命令将模式缓冲区的内容存储在文件中。下面给出的语法是write命令类似于delete命令。
    
    [address1[,address2]]w file 
    
    这里,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 
    
    在上面的示例中,我们将每一行与一个模式进行匹配,并将匹配的行存储在一个特定的文件中。这很简单。为了指定多个命令,我们使用-eSED 命令的开关。现在让我们看看每个文件包含什么:
    
    [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 通过其 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 
    
  • 更改命令

    SED 提供change或者replace由 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 命令的工作方式与 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
    
    请注意,要插入的条目在单独的行中输入,并由反斜杠 (\) 字符分隔。
  • 翻译命令

    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 命令指示 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
    
  • 读取命令

    我们可以指示 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 
    
  • 执行命令

    我们可以使用 SED 执行外部命令execute命令。它表示为e. 下面给出的是执行命令的语法。
    [address1[,address2]]e [command]
    
    让我们用一个简单的例子来说明执行命令。以下 SED 命令执行 UNIXdate第三行之前的命令。
    
    [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
    
    文件中的命令是不言自明的。在缺少...之下commande,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 后跟下一行。模式空间现在包含剑风暴\n乔治·RR·马丁。在下一步中,我们将用逗号替换换行符。
    喜欢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