Sed - 基本命令
-
简述
本章介绍了几个有用的 SED 命令。 -
删除命令
SED 提供各种命令来操作文本。我们先来探讨一下delete命令。以下是执行删除命令的方法:address1和address2分别是起始地址和结束地址,可以是行号或模式字符串。这两个地址都是可选参数。顾名思义,delete命令是用来执行删除操作的,由于SED是在线操作的,可以说这个命令是用来删除行的。请注意,delete 命令仅从模式缓冲区中删除行;该行不发送到输出流,原始文件保持不变。下面的例子说明了这一点。但是输出在哪里?如果没有提供线路地址,则默认情况下 SED 对每条线路进行操作。因此,它会从模式缓冲区中删除所有行。这就是该命令不在标准输出上打印任何内容的原因。让我们指示 SED 仅在某些线路上运行。以下示例仅删除第 4 行。执行上面的代码,你会得到以下结果:此外,SED 还接受使用逗号(,) 的地址范围。我们可以指示 SED 删除 N1 到 N2 行。例如,以下示例删除从 2 到 4 的所有行。执行上面的代码,你会得到以下结果:SED 的地址范围不仅限于数字。我们还可以将模式指定为地址。以下示例删除了作者 Paulo Coelho 的所有书籍。执行上面的代码,你会得到以下结果:我们还可以使用文本模式指定地址范围。以下示例删除模式之间的所有行Storm和Fellowship.除此之外,我们还可以在 SED 中使用美元 ($)、加号 (+) 和波浪号 (~) 运算符。 -
写命令
我们对任何文件执行的重要操作之一是备份,即我们制作文件的另一个副本。SED 提供write命令将模式缓冲区的内容存储在文件中。下面给出的语法是write命令类似于delete命令。这里,address1和address2分别是起始地址和结束地址,可以是行号或模式字符串。这两个地址都是可选参数。在上面的语法中,w是指写命令和file是您存储内容的文件名。小心file范围。提供文件名时,如果文件不存在,SED 会即时创建文件,如果文件已经存在,则将其覆盖。让我们使用 SED 制作文件的精确副本。请注意,两者之间必须恰好有一个空格w和file.我们创建了另一个名为books.bak.现在验证两个文件是否具有相同的内容。执行上面的代码,你会得到以下结果:你可以假设cp命令做同样的事情。是的!这cp命令做同样的事情,但 SED 是一个成熟的实用程序。它允许创建一个仅包含源文件中某些行的文件。让我们只将偶数行存储到另一个文件中。执行上面的代码,你会得到以下结果:您还可以在 write 命令中使用逗号 (,)、美元 ($) 和加号 (+) 运算符。除此之外,SED 还支持使用 write 命令进行模式匹配。假设您要将各个作者的所有书籍存储到一个单独的文件中。一种枯燥而冗长的方法是手动完成,而更聪明的方法是使用 SED。在上面的示例中,我们将每一行与一个模式进行匹配,并将匹配的行存储在一个特定的文件中。这很简单。为了指定多个命令,我们使用-eSED 命令的开关。现在让我们看看每个文件包含什么:执行上面的代码,你会得到以下结果:让我们显示文件内容。执行上面的代码,你会得到以下结果:让我们显示文件内容。执行上面的代码,你会得到以下结果:出色的!我们得到了预期的结果。SED 确实是一个了不起的实用程序。 -
追加命令
任何文本编辑器最有用的操作之一是提供附加功能。SED 通过其 append 命令支持此操作。下面给出了 append 的语法:让我们在第 4 行之后附加一个新的书条目。以下示例显示了如何执行此操作执行上面的代码,你会得到以下结果:在命令部分,4表示行号,a是追加命令,其余部分是要追加的文本。让我们在文件末尾插入一个文本行。为此,请使用$作为地址。以下示例说明了这一点:执行上面的代码,你会得到以下结果:除了行号,我们还可以使用文本模式指定地址。例如,以下示例在匹配字符串后附加文本The Alchemist.执行上面的代码,你会得到以下结果:请注意,如果有多个模式匹配,则在每次匹配后附加文本。以下示例说明了这种情况。执行上面的代码,你会得到以下结果: -
更改命令
SED 提供change或者replace由 c 表示的命令。此命令有助于用新文本替换现有行。提供行范围时,所有行将作为一个组替换为单个文本行。下面给出了更改命令的语法:让我们用其他文本替换第三行。执行上面的代码,你会得到以下结果:SED 也接受模式作为地址。在以下示例中,当模式匹配成功时替换一行。执行上面的代码,你会得到以下结果:SED 还允许用单行替换多行。下面的示例删除了从第四行到第六行并用新文本替换它们。执行上面的代码,你会得到以下结果: -
插入命令
insert 命令的工作方式与 append 非常相似。唯一的区别是它在特定位置之前插入一行。下面给出了插入命令的语法:让我们通过一些例子来理解插入命令。以下命令在第四行之前插入一个新条目。执行上面的代码,你会得到以下结果:在上面的例子中,4是位置编号,i暗示插入命令,其余部分是要插入的文本。要在文件开头插入文本,请将行地址提供为1. 以下命令说明了这一点:执行上面的代码,你会得到以下结果:此外,我们可以插入多行。以下命令在最后一行之前插入两行。执行上面的代码,你会得到以下结果:请注意,要插入的条目在单独的行中输入,并由反斜杠 (\) 字符分隔。 -
翻译命令
SED 提供了一个转换字符的命令,它表示为y. 它按位置转换字符。下面给出的是 translate 命令的语法:请注意,翻译是基于字符的位置list 1到相同位置的角色list 2并且两个列表都必须是明确的字符列表。不支持正则表达式和字符类。此外,尺寸list 1和list 2必须相同。以下示例将阿拉伯数字转换为罗马数字。执行上面的代码,你会得到以下结果: -
l 命令
你能仅通过查看它们来区分由空格分隔的单词和由制表符分隔的单词吗?当然不是。但是 SED 可以为您做到这一点。SED 使用l命令显示文本中的隐藏字符。例如,制表符与\t和行尾$特点。下面给出的语法是l命令。让我们创建一个带有制表符的文件进行演示。为简单起见,我们将使用相同的文件,只是用制表符替换空格。等待!但是如何做到这一点——通过在文本编辑器中打开文件并用制表符替换每个空格?当然不是!为此,我们可以使用 SED 命令。现在让我们使用l命令:执行上面的代码,你会得到以下结果:与其他 SED 命令一样,它也接受行号和模式作为地址。你可以自己试试。让我们仔细看看 SED 的另一个有趣的特性。我们可以指示 SED 在一定数量的字符后执行换行。以下示例在 25 个字符后换行。执行上面的代码,你会得到以下结果:请注意,在上面的示例中,在 l 命令之后提供了换行限制。在这种情况下,它是 25 个字符。此选项是 GNU 特定的,可能不适用于 SED 的其他变体。换行限制为 0 意味着除非有换行符,否则永远不会换行。下面的简单命令说明了这一点。执行上面的代码,你会得到以下结果: -
退出命令
Quit 命令指示 SED 退出当前执行流程。它由q命令。以下是 quit 命令的语法:请注意,quit 命令不接受地址范围,它只支持单个地址。默认情况下,SED 遵循读取、执行和重复工作流程;但是当遇到退出命令时,它只是停止当前的执行。让我们打印文件的前 3 行。执行上面的代码,你会得到以下结果:除了行号,我们还可以使用文本模式。当模式匹配成功时,以下命令退出。执行上面的代码,你会得到以下结果:除此之外,SED 还可以接受一个value可以用作退出状态。以下命令显示其退出状态为 100。执行上面的代码,你会得到以下结果:现在让我们验证退出状态。执行上面的代码,你会得到以下结果: -
读取命令
我们可以指示 SED 读取文件的内容并在特定条件匹配时显示它们。命令用字母表示r. 下面给出了 read 命令的语法。请注意,两者之间必须恰好有一个空格r命令和文件名。让我们用一个简单的例子来理解它。创建一个名为的示例文件junk.txt.以下命令指示 SED 读取junk.txt并在第三行之后插入它们。执行上面的代码,你会得到以下结果:在上面的例子中,3 表示线路地址,r是命令名称,并且junk.txt是要显示其内容的文件名。此外,GNU SED 还接受一系列地址。例如,以下命令插入junk.txt在第三、四、五行之后。执行上面的代码,你会得到以下结果:与其他 SED 命令一样,读取命令也接受模式作为地址。例如,以下命令插入junk.txt当模式匹配成功时。执行上面的代码,你会得到以下结果: -
执行命令
我们可以使用 SED 执行外部命令execute命令。它表示为e. 下面给出的是执行命令的语法。让我们用一个简单的例子来说明执行命令。以下 SED 命令执行 UNIXdate第三行之前的命令。执行上面的代码,你会得到以下结果:与其他命令一样,它也接受模式作为地址。例如,下面的例子执行date模式匹配成功时的命令。请注意,每次模式匹配后,首先执行命令,然后显示模式缓冲区的内容。执行上面的代码,你会得到以下结果:如果您观察e仔细指挥,你会注意到command是可选的。之后没有提供命令时e,它将模式缓冲区的内容视为外部命令。为了说明这一点,让我们创建一个包含一些简单命令的 commands.txt 文件。执行上面的代码,你会得到以下结果:文件中的命令是不言自明的。在缺少...之下command后e,SED 会一一执行所有这些命令。下面的简单示例说明了这一点。执行上面的代码,你会得到以下结果:与其他 SED 命令一样,execute 命令也接受所有有效的地址范围。 -
杂项命令
默认情况下,SED 在单行上运行,但它也可以在多行上运行。多行命令用大写字母表示。例如,与n指挥部N命令不会清除和打印模式空间。相反,它在当前模式空间的末尾添加一个换行符 (\n),并将输入文件中的下一行附加到当前模式空间,并通过执行其余的 SED 命令继续 SED 的标准流程。下面给出的语法是N命令。让我们打印一个以逗号分隔的书名及其各自作者的列表。以下示例说明了这一点。执行上面的代码,你会得到以下结果:让我们了解上面的示例是如何工作的。这N命令读取第一行,即 A Storm of Swords 到模式缓冲区并附加 \n 后跟下一行。模式空间现在包含剑风暴\n乔治·RR·马丁。在下一步中,我们将用逗号替换换行符。喜欢p命令,我们有一个P命令打印由N命令。下面给出的语法是P命令类似于p命令。在前面的例子中,我们看到N命令创建一个以换行符分隔的书名及其作者列表。让我们只打印它的第一部分,即只打印书名。以下命令说明了这一点。执行上面的代码,你会得到以下结果:请注意,在没有N, 它的行为与p命令。下面的简单命令说明了这种情况。执行上面的代码,你会得到以下结果:除此之外,SED 还提供了一个v检查版本的命令。如果提供的版本大于安装的 SED 版本,则命令执行失败。请注意,此选项是 GNU 特定的,可能不适用于 SED 的其他变体。下面给出的语法是v命令。首先,找出 SED 的当前版本。执行上面的代码,你会得到以下结果:在以下示例中,SED 版本高于版本 4.2.2,因此 SED 命令中止其执行。执行上面的代码,你会得到以下结果:但如果提供的版本小于或等于 4.2.2 版本,则该命令按预期工作。执行上面的代码,你会得到以下结果: