千家信息网

sed4.4手册

发表于:2024-11-11 作者:千家信息网编辑
千家信息网最后更新 2024年11月11日,sed,流编辑器目录1简介2运行sed2.1概述2.2命令行选项2.3退出状态3sed脚本3.1 sed脚本概述3.2 sed命令摘要3.3 s命令3.4常用命令3.5较少使用的命令3.6 sed大师
千家信息网最后更新 2024年11月11日sed4.4手册

sed,流编辑器

目录

  • 1简介
  • 2运行sed
    • 2.1概述
    • 2.2命令行选项
    • 2.3退出状态
  • 3sed脚本
    • 3.1 sed脚本概述
    • 3.2 sed命令摘要
    • 3.3 s命令
    • 3.4常用命令
    • 3.5较少使用的命令
    • 3.6 sed大师命令
    • 3.7特定于GNU的命令 sed
    • 3.8多种命令语法
      • 3.8.1需要换行符的命令
  • 4地址:选择行
    • 4.1地址概述
    • 4.2按数字选择行
    • 4.3通过文本匹配选择行
    • 4.4范围地址
  • 5正则表达式:选择文本
    • 5.1正则表达式概述 sed
    • 5.2基本(BRE)和扩展(ERE)正则表达式
    • 5.3基本正则表达式语法概述
    • 5.4扩展正则表达式语法概述
    • 5.5字符类和括号表达式
    • 5.6正则表达式扩展
    • 5.7反向引用和子表达式
    • 5.8转义序列 - 指定特殊字符
    • 5.9语言环境注意事项
  • 6高级sed:循环和缓冲区
    • 6.1 sed工作原理
    • 6.2保持和模式缓冲区
    • 6.3多线技术 - 使用D,G,H,N,P来处理多条线
    • 6.4分支和流量控制
      • 6.4.1分支和周期
      • 6.4.2分支示例:连线
  • 7一些示例脚本
    • 7.1连线
    • 7.2中心线
    • 7.3增加数字
    • 7.4将文件重命名为小写
    • 7.5打印bash环境
    • 7.6线的反转字符
    • 7.7跨多行的文本搜索
    • 7.8线长调整
    • 7.9文件的反向行
    • 7.10编号
    • 7.11编号非空行
    • 7.12计数字符
    • 7.13计数单词
    • 7.14计数线
    • 7.15打印第一行
    • 7.16打印最后一行
    • 7.17使重复行独特
    • 7.18打印输入的重复行
    • 7.19删除所有重复的行
    • 7.20挤压空白线
  • 8 GNU sed的限制和不受限制
  • 9其他资源学习关于 sed
  • 10报告错误
  • 附录A GNU自由文件许可证
  • 概念指数
  • 命令和选项索引

GNU sed

该文件记录GNU 版本4.4 sed,一个流编辑器。

版权所有©1998-2017自由软件基金会

授权根据GNU自由文件许可证1.3版或自由软件基金会发布的任何更新版本的条款复制,分发和/或修改本文档; 没有不变的部分,没有封面文本,也没有封底文本。许可证的副本包含在题为"GNU自由文件许可证"的部分。


1简介

sed是一个流编辑器。流编辑器用于对输入流(文件或流水线的输入)执行基本文本转换。虽然在某些方面类似于允许脚本编辑(例如ed 的编辑器,sed只能通过输入一次,但效率更高。但是,它有sed能力在管道中过滤文本,特别区别于其他类型的编辑器。



2运行sed

本章介绍如何运行sedsed 脚本和单个sed命令的详细信息将在下一章讨论。


2.1概述

通常sed被这样调用:

sed SCRIPT INPUTFILE ... 

例如,要取代所有出现的"你好' 至 '世界'在文件中 input.txt中

sed / s / hello / world /'input.txt> output.txt 

如果不指定INPUTFILE,或者如果INPUTFILE - sed过滤标准输入的内容。以下命令是等效的:

sed / s / hello / world /'input.txt> output.txt  sed's / hello / world /' output.txt  cat input.txt | sed / s / hello / world /' - > output.txt 

sed将输出写入标准输出。使用-一世在现场编辑文件而不是打印到标准输出。又见Ws///w写入输出到其它文件的命令。以下命令修改file.txt的 并且不产生任何输出:

sed -i / hello / world'file.txt 

默认情况下sed打印所有已处理的输入(除了通过命令修改/删除的输入d)。使用-n抑制输出,以及p打印特定行命令。以下命令仅打印输入文件的第45行:

sed -n'45p'file.txt 

sed将多个输入文件视为一个长流。以下示例打印第一个文件的第一行(此时就把one.txt存盘)和最后一个文件的最后一行(three.txt)。使用-s 以扭转这种行为。

sed -n'1p; $ p'one.txt two.txt three.txt 

没有 -e 要么 -F选项,sed使用第一个非选项参数作为脚本,以及以下非选项参数作为输入文件。如果-e 要么 -F选项用于指定脚本,所有非选项参数均作为输入文件。选项-e -F可以组合,并且可以出现多次(在这种情况下,最终的有效脚本将连接所有单个脚本)。

以下示例是等效的:

sed'/ hello / world /'input.txt> output.txt   sed -e's / hello / world  /'input.txt > output.txt sed --expression ='s / hello / world /'input.txt > output.txt   echo's / hello / world /'> myscript.sed  sed -f myscript.sed input.txt> output.txt  sed --file = myscript.sed input.txt> output.txt 

2.2命令行选项

调用的完整格式sed是:

sed选项... [SCRIPT] [INPUTFILE ...] 

sed 可以使用以下命令行选项调用:

--version

打印sed正在运行的版本和版权声明,然后退出。

--help

打印使用消息,简要总结这些命令行选项和错误报告地址,然后退出。

-n --quiet --silent

默认情况下,sed通过脚本在每个循环结束时打印出图案空间(请参阅如何sed工作)。这些选项禁用此自动打印,并且sed仅在通过p命令明确告知时才产生输出

-e script --expression=script

脚本中的命令添加到要处理输入时要运行的命令集。

-f script-file --file=script-file

将文件脚本文件中包含的命令添加 到要处理输入时要运行的命令集。

-i[SUFFIX] --in-place[=SUFFIX]

此选项指定要在现场编辑文件。 GNU sed通过创建临时文件并将输出发送到此文件而不是标准输出。1

这个选项意味着 -s

当文件结束到达时,临时文件将重命名为输出文件的原始名称。扩展名(如果提供)用于在重命名临时文件之前修改旧文件的名称,从而备份副本2)。


该规则遵循:如果扩展名不包含a *,则作为后缀添加到当前文件名的末尾; 如果扩展名包含一个或多个* 字符,则每个星号将替换为当前文件名。这允许您为备份文件添加前缀,而不是(或除了)后缀,甚至将原始文件的备份副本放置到另一个目录中(如果目录已存在)。

如果没有提供扩展名,原始文件将被覆盖而不进行备份。

-l N --line-length=N

指定命令的默认换行长度l长度为零(零)意味着永远不要缠绕长线。如果未指定,则取为70。

--posix

GNU sed包括POSIX sed的几个扩展名为了简化写入便携式脚本,此选项将禁用此手册所有文档的扩展名,包括其他命令。 大多数扩展sed程序都接受POSIX所规定的语法之外的程序,但其中一些(例如Reporting Bugs中N描述命令的行为)实际上违反了标准。如果要仅禁用后一种扩展名,则可以将该变量设置为非空值。 POSIXLY_CORRECT

-b --binary

此选项在每个平台上可用,但仅在操作系统区分文本文件和二进制文件之间才有效。当进行这样的区分时,如MS-DOS,Windows的情况,Cygwin文本文件由由回车符换行字符分隔的行组成 ,并且sed看不到结尾的CR。当指定此选项时,sed将以二进制模式打开输入文件,因此不要求此特殊处理,并考虑以行结尾的行。

--follow-symlinks

此选项仅在支持符号链接的平台上可用,并且仅在选项时才有效果 -一世 被指定。在这种情况下,如果在命令行中指定的文件是符号链接,sed则将跟随链接并编辑链接的最终目的地。默认行为是中断符号链接,以使链接目的地不被修改。

-E -r --regexp-extended

使用扩展正则表达式而不是基本正则表达式。扩展的正则表达式是那些 egrep接受的; 它们可以更清晰,因为它们通常具有较少的反斜杠。历史上这是一个GNU扩展,但是-E 扩展已经被添加到POSIX标准(http://austingroupbugs.net/view.php?id=528),所以使用 -E为了便携性。GNU sed已经接受了-E 作为多年来的无证选项,* BSD seds已经接受 -E 多年以来,但使用的脚本 -E可能不会移植到其他旧系统。扩展正则表达式

-s --separate

默认情况下,sed会将命令行上指定的文件视为单个连续的长流。GNU sed 扩展允许用户将它们视为单独的文件:范围地址(如"/ ABC /,/ DEF /')不允许跨越多个文件,行号相对于每个文件的开始,$指的是每个文件的最后一行,并且从R命令调用的文件在每个文件的开头都被重绕。

--sandbox

在沙箱模式下, e/w/r命令被拒绝 - 包含它们的程序将被中止而不运行。沙箱模式确保sed 仅在命令行上指定的输入文件上运行,并且无法运行外部程序。

-u --unbuffered

缓冲输入和输出尽可能最低限度。(如果输入来自"尾巴',您希望尽快看到转换后的输出。)

-z --null-data --zero-terminated

将输入视为一组行,每行以零字节(ASCII'NUL'字符)而不是换行符。此选项可用于命令,如'-z'和'find -print0'来处理任意的文件名。

如果不 -e -F - 表达, 要么 - 文件 选项在命令行中给出,则命令行上的第一个非选项参数被视为要执行脚本

如果在处理上述内容后仍有任何命令行参数,这些参数将被解释为要处理的输入文件的名称。 文件名" - '指标准输入流。如果没有指定文件名,将处理标准输入。



2.3退出状态

退出状态为零表示成功,非零值表示失败。GNU sed返回以下退出状态错误值:

0

成功完成

1

无效的命令,无效的语法,无效的正则表达式或与之一起使用 GNU sed扩展命令--posix

2

在命令行上指定的一个或多个输入文件无法打开(例如,如果找不到文件或拒绝读取权限)。处理继续与其他文件。

4

I / O错误或运行时严重的处理错误, GNU sed立即中止。

另外,该命令qQ可用于终止 sed与自定义退出代码值(这是一个GNU sed扩展名):

$ echo | sed'Q42'; echo $? 42 


3个sed脚本


3.1 sed脚本概述

sed程序由一个或多个的sed命令,由一个或多个的传递 -e -F - 表达,和 - 文件 选项或第一个非选项参数,如果使用这些选项的零。本文将参考"the" sed脚本; 这被理解为意味着传入的所有脚本脚本文件顺序连接。请参阅概述

sed 命令遵循以下语法:

[addr] X [选项] 

X是单字母sed命令。 [addr]是可选的行地址。如果[addr]指定,则命令X将仅在匹配的行上执行。 [addr]可以是单行号,正则表达式或行范围(请参见sed地址)。额外[options]的用于某些sed命令。

以下示例删除输入中的行30到35。 30,35是地址范围。d是delete命令:

sed '30,35d'input.txt> output.txt 

以下示例打印所有输入,直到以"FOO'被发现。如果找到这样的行, sed将以退出状态42终止。如果没有找到这样的行(并且没有其他错误发生),sed 将退出状态0. /^foo/是一个正则表达式地址。 q是退出命令。42是命令选项。

sed'/ ^ foo / q42'input.txt> output.txt 

一个内的命令脚本脚本文件可以由分号(分离;)或换行符(ASCII 10)。可以指定多个脚本-e 要么 -F 选项。

以下示例都是等效的。他们执行两个sed 操作:删除与正则表达式匹配的任何行/^foo/,并替换字符串的所有出现"你好'与'世界":

sed'/ ^ foo / d; s / hello / world /'input.txt> output.txt   sed -e'/ ^ foo / d'-e's / hello / world /'input.txt> output.txt   echo'/ ^ foo / d'> script.sed  echo's / hello / world /'>> script.sed  sed -f script.sed input.txt> output.txt   echo'/ hello / world /'> script2.sed  sed -e'/ ^ foo / d'-f script2.sed input.txt> output.txt 

命令aci,由于它们的语法,不能被随后工作作为命令分隔符分号,因此应当用换行被终止或者被放置在的末端脚本脚本文件命令之前也可以带有可选的非空白字符。请参阅多命令语法



3.2 sed命令摘要

GNU 支持以下命令sed一些是标准的POSIX命令,而另外一些是GNU扩展。每个命令的详细信息和示例如下。(助记符)显示在括号中。

a\ text

在一行后附加文本

a text

在一行之后附加文本(替代语法)。

b label

无条件分配标签标签可以被省略,在这种情况下,在下一个周期开始。

c\ text

文本替换(更改)行

c text

文本替换(更改)行(替代语法)。

d

删除图案空间; 马上开始下一个循环。

D

如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并重新启动循环与结果模式空间,而不会读取新的输入行。

如果模式空间不包含换行符,则会像d执行命令一样启动正常的新循环

e

执行在模式空间中找到的命令,并使用输出替换模式空间; 尾随的换行被压制。

e command

执行命令并将其输出发送到输出流。该命令可以跨多行运行,除了最后一行之外,还有一个反斜杠。

F

(filename)打印当前输入文件的文件名(带尾随的换行符)。

g

使用保持空间的内容替换图案空间的内容。

G

在图案空间的内容中附加换行符,然后将保留空间的内容附加到模式空间的内容。

h

(保持)用图案空间的内容替换保持空间的内容。

H

在保留空间的内容中附加换行符,然后将模式空间的内容附加到保留空间的内容。

i\ text

在一行之前插入文字

i text

在一行之前插入文本(替代语法)。

l

以明确的形式打印图案空间。

n

(接下来)如果自动打印未被禁用,请打印图案空间,然后,无论如何将图案空间替换为下一行输入。如果没有更多的输入,则sed退出而不处理任何命令。

N

向模式空间添加换行符,然后将下一行输入追加到模式空间。如果没有更多的输入,则sed退出而不处理任何命令。

p

打印图案空间。

P

打印图案空间,直到第一个。

q[exit-code]

(退出)退出sed而不处理任何命令或输入。

Q[exit-code]

(退出)此命令q与图形空间的内容相同,但不会打印。q一样,它提供了返回一个退出代码给调用者的功能。

r filename

读取文本文件一个文件。例:

R filename

在当前周期结束时或当读取下一个输入行时,将一行文件名排队读取并插入到输出流中。

s/regexp/replacement/[flags]

(替换)将正则表达式与模式空间的内容进行匹配。如果找到了,更换匹配的字符串 替换

t label

(测试)分支到标签,只有当s自上一条输入行被读取或条件分支以来已成功 执行时,才能进行标记标签可以被省略,在这种情况下,在下一个周期开始。

T label

(测试)只有当自上次输入行被读取或条件分支以来没有成功的 ubstitut 分支,才能进行标签s标签可以被省略,在这种情况下,在下一个周期开始。

v [version]

(版本)此命令不执行任何操作,但sed如果 不支持GNU sed扩展,或者所请求的版本不可用,则会失败。

w filename

将模式空间写入文件名

W filename

将给定的文件名写入到第一个换行符的模式空间的部分

x

交换保留和模式空格的内容。

y/src/dst/

将与任何源字符匹配的模式空间中的任何字符dest-chars中的相应字符进行音译

z

(zap)此命令清空模式空间的内容。

#

一个评论,直到下一个换行符。

{ cmd ; cmd ... }

组合几个命令。

=

打印当前输入行号(带有尾随的换行符)。

: label

指定的位置的标签为分支命令(b tT)。


3.3 s命令

s命令(如替代)可能是最重要的sed,有很多不同的选择。s命令的语法是's / regexp / replacement / flags"。

它的基本概念很简单:该s命令尝试将模式空间与提供的正则表达式regexp匹配; 如果匹配成功,则匹配的模式空间的那部分被替换替换

有关regexp语法的详细信息,请参阅正则表达式地址

所述替换可以包含?是一个从1到9,包括端点)的引用,这指的是包含在之间的匹配的所述部分? 及其匹配此外,替换可以包含 引用模式空间的整个匹配部分的未转义字符。 \n\(\)&

/ 字符可通过任何给定的内的任何其他单个字符被均匀地取代s命令。/ 字符(或任何其他字符代替它使用)可以在出现正则表达式替换 仅当它是由前面\的字符。

最后,作为一个GNU sed扩展,可以包括由一个反斜杠和一个字母的特殊序列 LlUu,或E其含义如下:

\L

将替换为小写,直到找到\U\E找到,

\l

将下一个字符转成小写,

\U

将替换成大写,直到找到\L\E找到,

\u

将下一个字符转成大写字母,

\E

停止案件转换由\L开始\U

g标志被使用时,情况转换不会从正常表达式的一个出现传播到另一个。例如,当执行以下命令时,AB-'在图案空间:

S / \(B \ \?) -  / X \ U \ 1 /克 

输出为'axxB"。当更换第一个' - ',''序列只影响'\ 1"。它不影响x更换时被添加到模式空间字符b-xB

在另一方面,\l并且\u做影响了替换文本的其余部分,如果他们之后是一个空的替代。随着'AB-'在模式空间中,以下命令:

S / \(B \ \?) -  / \ U \ 1X /克 

将取代" - '与'X'(大写)和'B-'与'BX"。如果这种行为是不希望的,你可以通过添加一个"。\ E'序后'\ 1' 在这种情况下。

要包括文字\&或在最终替换换行符,一定要早于期望的\&或换行的置换\

s命令可以后跟零个或多个以下标志

g

将替换应用于所有匹配到正则表达式,而不仅仅是第一个。

number

只有更换届的匹配正则表达式


s指挥 相互作用注意:POSIX标准没有指定当您混合g数字修饰符时应该发生什么,并且目前在sed实现中没有广泛同意的含义对于GNU sed,交互定义为:在数字 th 之前忽略匹配,然后匹配并替换所有匹配的数字

p

如果进行替换,则打印新的图案空间。

注意:当指定选项pe选项时,两者的相对排序产生非常不同的结果。一般来说,ep(评估然后打印)是你想要的,但另一方面操作可能对调试是有用的。因此,当前版本的GNU sed特别解释p了前后选项的存在,e在评估之前和之后 打印模式空间,而一般来说,该s命令的标志只显示一次。尽管如此,这种行为可能会在将来的版本中发生变化。

w filename

如果进行替换,则将结果写入命名文件。作为GNU sed扩展,支持两个特殊的文件名的/ dev /标准错误,将结果写入标准错误,以及 的/ dev /标准输出,写入标准输出。3

e

该命令允许从shell命令将输入管道转换为模式空间。如果进行替换,则执行在模式空间中找到的命令,并将其空格替换为其输出。尾随的换行被压制; 如果要执行的命令包含NUL字符,则结果未定义这是一个GNU sed扩展。

I i

I正则表达式匹配修饰符是一个GNU 扩展,它使sed匹配正则表达式以不区分大小写的方式。

M m

M正则表达式匹配修饰符是GNU sed 扩展,它指示GNU sed多行模式下匹配正则表达式修饰符分别引起^$匹配换行符之后的空字符串(除正常行为之外),换行符之前的空字符串。有一些特殊的字符序列(\`\')始终与缓冲区的开头或结尾相匹配。另外,在多行模式下,句点字符与新行字符不匹配。


3.4常用命令

如果你完全使用sed,你很可能想知道这些命令。

#



#字符开头的注释; 评论将持续到下一个换行符。


如果您关心可移植性,请注意,某些实现sed(其不 符合POSIX的)可能仅支持单个单行注释,然后仅在脚本的第一个字符为a时才支持#


警告:如果sed脚本的前两个字符#n,那么-n(no-autoprint)选项被强制。如果您想在脚本的第一行发表评论,该评论以字母"?"你不想要这个行为,那么一定要用一个资本"?'或者在'?"。

q [exit-code]

退出sed而不处理任何命令或输入。

示例:打印第二行后停止:

$ seq 3 | sed 2q  1  2 

此命令只接受一个地址。请注意,如果没有禁用自动打印,则打印当前图案空间-n选项。sed脚本返回退出代码的功能GNU sed扩展。

另请参见GNU sed扩展Q命令,无需打印当前模式空间即可静默退出。

d

删除图案空间; 马上开始下一个循环。

示例:删除第二个输入行:

$ seq 3 | sed 2d  1  3 
p

打印图案空间(到标准输出)。此命令通常仅与该命令配合使用-n 命令行选项。

示例:仅打印第二个输入行:

$ seq 3 | sed -n 2p  2 
n

如果未禁用自动打印,请打印图案空间,然后,无论如何使用下一行输入替换图案空间。如果没有更多的输入,则sed退出而不处理任何命令。

该命令对于跳过线是有用的(例如,每第N行处理)。

示例:在每3行执行替换(即两个n命令跳过两行):

$ seq 6 | sed'n; n; s /./ x /'  1  2  x  4  5  x 

GNU sed提供的扩展地址语法第一?步骤 ,以实现相同的结果:

$ seq 6 | sed'0?3s /./ x /'  1  2  x  4  5  x 
{ commands }

一组命令可之间被封闭 {}字符。当您希望通过单个地址(或地址范围)匹配来触发一组命令时,这特别有用。

示例:执行替换然后打印第二个输入行:

$ seq 3 | sed -n'2 {s / 2 / X /; p}'  X 

3.5较少使用的命令

虽然可能比上一节更少使用,但是sed可以使用这些命令构建一些非常小的但有用的脚本。

y/source-chars/dest-chars/

将与任何源字符匹配的模式空间中的任何字符dest-chars中的相应字符进行音译

示例:音译'AJ'进'0-9":

$ echo你好世界|  sed'y / abcdefghij / 0123456789 /' 74llo worl3 

/任何给定y命令中字符可以被任何其他单个字符均匀地替换。)

所述的实例/(或者任何其他字符代替它使用), \或换行符可以出现在源极-字符DEST-字符 列表,提供每个实例由逃脱\源极-字符DEST-字符列表必须 包含相同数量的字符(后脱逸出)。

有关tr类似的功能,请参阅GNU coreutils中命令。

a text

追加文本行之后。这是标准命令GNU扩展名a- 有关详细信息,请参见下文。

示例:添加"你好"第二行之后:

$ seq 3 | SED '2A你好'  1  2  3 

a命令之后的空白空白被忽略。要添加的文本被读取直到行尾。

a\ text

追加文本行之后。

示例:添加'你好'后第二行( - |表示打印输出行):

$ seq 3 | sed'2a \  hello'  -  | 1  -  | 2  -  | hello  -  | 3 

a命令将按照此命令(每个但最后一个结尾以及\从输出中删除的)命令排队,以在当前周期结束时或当读取下一个输入行时排队。


作为GNU扩展,此命令接受两个地址。

处理文本中的转义序列,因此您应该\\文本中使用打印单个反斜杠。

命令在最后一行之后恢复,而没有反斜杠(\) - '世界'在下面的例子中:

$ seq 3 | sed'2a \  hello \  world  3s /./ X /'  -  | 1  -  | 2  -  | hello  -  | world  -  | X 

作为GNU扩展,a命令和文本可以分为两个-e参数,使脚本更容易:

$ seq 3 | sed -e'2a \'-e hello  1  2  hello  3   $ sed -e'2a \'-e"$ VAR" 
i text

在一行之前插入文字这是标准命令GNU扩展名i- 有关详细信息,请参见下文。

示例:插入"你好"在第二行之前:

$ seq 3 | SED '2I你好'  1  你好 2  3 

i命令之后的空白空白被忽略。要添加的文本被读取直到行尾。

i\ text

立即输出跟随此命令的文本行。

示例:插入'你好'在第二行之前( - |表示打印输出行):

$ seq 3 | sed'2i \  hello'  -  | 1  -  | hello  -  | 2  -  | 3 

作为GNU扩展,此命令接受两个地址。

处理文本中的转义序列,因此您应该\\文本中使用打印单个反斜杠。

命令在最后一行之后恢复,而没有反斜杠(\) - '世界'在下面的例子中:

$ seq 3 | sed'2i \  hello \  world  s /./ X /'  -  | X  -  | hello  -  | world  -  | X  -  | X 

作为GNU扩展,i命令和文本可以分为两个-e参数,使脚本更容易:

$ seq 3 | sed -e'2i \'-e hello  1  hello  2  3   $ sed -e'2i \'-e"$ VAR" 
c text

文字代替行这是标准命令GNU扩展名c- 有关详细信息,请参见下文。

示例:将第2至第9行替换为"你好":

$ seq 10 | SED '2,9c你好'  1只 10 

c命令之后的空白空白被忽略。要添加的文本被读取直到行尾。

c\ text

删除匹配地址或地址范围的行,并输出该命令后面的文本行。

示例:用第2至第4行替换"你好'和'世界'( - |表示打印输出行):

$ seq 5 | sed'2,4c \  hello \  world'  -  | 1  -  | hello  -  | world  -  | 5 

如果没有给出地址,则替换每一行。

此命令完成后,将启动一个新的循环,因为模式空间将被删除。在下面的示例中,c启动一个新的循环,替换文本不执行替换命令:

$ seq 3 | sed'2c \  hello  s /./ X /'  -  | X  -  | hello  -  | X 

作为GNU扩展,c命令和文本可以分为两个-e参数,使脚本更容易:

$ seq 3 | sed -e'2c \'-e hello  1  hello  3   $ sed -e'2c \'-e"$ VAR" 
=

打印当前的输入行号(带有尾随的换行符)。

$ printf'%s \ n'aaa bbb ccc | sed =  1  aaa  2  bbb  3  ccc 

作为GNU扩展,此命令接受两个地址。

l n

以明确的形式打印图案空间:不可打印的字符(和\字符)以C风格的转义格式打印; 长行被分割,尾随\字符表示分割; 每行的末尾都标有a $

n指定所需的换行长度; 长度为0(零)意味着永远不要缠绕长线。如果省略,则使用在命令行中指定的默认值。所述? 参数是一个GNU sed扩展。

r filename

读取文本文件一个文件。例:

$ seq 3 | SED '2R的/ etc /主机名称'  1  2  fencepost.gnu.org  3 

在当前周期结束时或当读取下一个输入行时,将要读取并插入到输出流中的文件名的内容排队请注意,如果无法读取文件名,则将其视为空文件,无任何错误指示。

作为GNU sed扩展,特殊值的/ dev /标准输入 支持文件名,其中读取标准输入的内容。


作为GNU扩展,此命令接受两个地址。然后将文件重新读取并插入到每个寻址行上。

w filename

将模式空间写入文件名作为GNU sed扩展,支持两个特殊的文件名的/ dev /标准错误,将结果写入标准错误,以及 的/ dev /标准输出,写入标准输出。4

在读取第一个输入行之前,将创建(或截断)该文件; 引用相同文件名的所有w命令(包括w成功s命令标志的实例)在 不关闭并重新打开文件的情况下输出。

D

如果模式空间不包含换行符,则会像d执行命令一样启动正常的新循环否则,删除图形空间中的文本直到第一个换行符,并重新启动循环与结果模式空间,而不读取新的输入行。

N

向模式空间添加换行符,然后将下一行输入追加到模式空间。如果没有更多的输入,则sed退出而不处理任何命令。

什么时候 -z 被使用,零字节(ascii'NUL'字符)添加在行之间(而不是新行)。

sed如果没有"下一个"输入行,默认情况下不会终止。这是可以禁用的GNU扩展--posix请参阅最后一行的N命令

P

将图案空间的部分打印到第一个换行符。

h

使用模式空间的内容替换保持空间的内容。

H

在保留空间的内容中附加换行符,然后将模式空间的内容附加到保留空间的内容。

g

使用保持空间的内容替换图案空间的内容。

G

在图案空间的内容中附加换行符,然后将保留空间的内容附加到模式空间的内容。

x

交换保留和模式空格的内容。


3.6 sed大师命令

在大多数情况下,使用这些命令表明,您可能更喜欢像awk Perl 这样的编程但偶尔有人坚持坚持sed,这些命令可以使一个人写一个非常复杂的脚本。

: label

[无地址]


指定分支命令标签位置在所有其他方面,无操作。

b label

无条件分支到标签标签可以被省略,在这种情况下,在下一个周期开始。

t label

只有当自上一条输入行被读取或有条件分支以来已成功执行ubstitution时,才能进行标记s标签可以被省略,在这种情况下,在下一个周期开始。


3.7特定于GNU的命令 sed

这些命令是特定于GNU的 sed,所以你必须小心使用它们,只有当你确定阻碍可移植性不是坏的时候。它们允许您检查GNU sed扩展或者经常需要执行的任务,但不支持标准sed

e [command]

该命令允许从shell命令将输入管道转换为模式空间。没有参数,e命令执行在模式空间中找到的命令,并用输出替换模式空间; 尾随的换行被压制。

如果指定了参数,则该e命令将其解释为命令,并将其输出发送到输出流。该命令可以跨多行运行,除了最后一行之外,还有一个反斜杠。

在这两种情况下,如果要执行的命令包含NUL字符,则结果是未定义的

请注意,与r命令不同,命令的输出将立即打印; r命令会将输出延迟到当前周期的结束。

F

打印当前输入文件的文件名(带尾随的换行符)。

Q [exit-code]

此命令只接受一个地址。


此命令q与图形空间的内容相同,但不会打印。q一样,它提供了返回一个退出代码给调用者的功能。

这个命令可以是有用的,因为完成这个显而易见的微不足道的功能的唯一替代方法是使用 -n 选项(这可能会使您的脚本不必要地复杂化)或使用以下代码片段,这样通过读取整个文件而浪费时间,而没有任何明显的效果:

:吃 $ d 在最后一行静静地退出 N 读另一行,默默地 g 每次覆盖模式空间以节省内存 b吃 
R filename

在当前周期结束时或当读取下一个输入行时,将一行文件名排队读取并插入到输出流中。请注意,如果无法读取文件名,或者如果文件名达不到,则不附加任何行,没有任何错误指示。

r命令一样,具有特殊的价值的/ dev /标准输入 对于从标准输入读取一行的文件名是受支持的。

T label

只有在自上次输入行被读取或有条件分支以来没有成功的 ubstitut时,才能进行标记s标签可以被省略,在这种情况下,在下一个周期开始。

v version

此命令不执行任何操作,但sed如果不支持GNU sed扩展,则会失败 ,因为其他版本sed不实现。另外,您可以指定sed脚本所需的版本,例如4.0.5默认是4.0 因为这是实现此命令的第一个版本。

此命令即使在环境中设置,可以启用所有GNU扩展 POSIXLY_CORRECT

W filename

将给定的文件名写入到第一个换行符的模式空间的部分。w关于文件处理命令下的一切都在这里。

z

此命令清空模式空间的内容。它通常与"小号/.*//',但是效率更高,并且在输入流中存在无效多字节序列的情况下起作用。 POSIX要求这样的序列匹配"',所以sed在大多数多字节语言环境(包括UTF-8语言环境)中,没有可移植的方式清除脚本中间的缓冲区。


3.8多种命令语法

sed 程序中指定多个命令有几种方法

从文件运行sed脚本时,使用换行符是最自然的(使用 -F 选项)。

在命令行中,所有sed命令可能被换行分隔。或者,您可以将每个命令指定为参数-e 选项:

$ seq 6 | SED '1D  3D  5D'  2  4  6   $ 6序列| sed -e 1d -e 3d -e 5d  2  4  6 

分号(';')可以用来分离最简单的命令:

$ seq 6 | SED '1D; 3D;图5d'  2  4  6 

{}btT:命令可以用分号分隔(这是一个非便携式GNU sed扩展名)。

$ seq 4 | sed'{1d; 3d}'  2  4   $ seq 6 | SED '{1D; 3D};图5d'  2  4  6 

在使用的标签btT:指令被读取,直到一个分号。领先和尾随的空白被忽略。在下面的例子中,标签是"X"。第一个例子与GNU一起使用 sed第二个是便携式的等价物。有关分支和标签的更多信息,请参阅分支和流控制

$ seq 3 | sed'/ 1 / bx; s / ^ / = /; :X ; 3D"  1  = 2   $ SEQ 3 | SED -e '/ 1 / BX' -e 'S / ^ / = /' -e ':X' -e '3D'  1  = 2 
3.8.1需要换行符的命令

以下命令不能用分号分隔,需要换行符:

aci(追加/变更/插入)

所有字符以下aci命令被作为追加/变更/插入的文本。使用分号会导致不良结果:

$ seq 2 | sed'1aHello; 2D"  1  您好; 2d  2 

使用命令分开 -e 或换行:

$ seq 2 | sed -e 1aHello -e 2d  1  Hello   $ seq 2 | SED '1aHello  2D'  1  你好 

请注意,指定要添加的文本('你好")后aci本身就是一个GNU sed扩展。符合POSIX标准的便携式解决方案是:

$ seq 2 | SED '1A \  你好 2D'  1  你好 
# (评论)

所有字符"直到下一个换行符被忽略。

$ seq 3 | sed'#这是一个评论; 2D"  1  2  3   $ SEQ 3 | SED '#这是一条评论 2D'  1  3 
rRwW(读取和写入文件)

rRwW命令解析的文件名,直至行尾。如果找到空格,注释或分号,它们将被包含在文件名中,导致意想不到的结果:

$ seq 2 | sed'1w hello.txt; 2D"  1个 2   $ LS -log  总共4  -rw-RW-R-- 1 23年1月2日23时03 hello.txt的; 2d   $ cat'hello.txt; 2D"  1 

请注意,sed在自动忽略读/写错误 rRwW命令(如文件丢失)。在以下示例中,sed尝试读取名为"hello.txt; ?"。文件丢失,错误被忽略:

$ echo x | sed'1rhello.txt; N"  X 
e (命令执行)

e命令之后的任何字符直到行尾都将发送到shell。如果找到空格,注释或分号,它们将被包含在shell命令中,导致意想不到的结果:

$ echo a | SED '1E触摸富#酒吧'  一个  $ LS -1  富#酒吧  $回显| sed'1e touch foo; s / a / b /'  sh:1:s / a / b /:找不到 a 
s///[we](用e代替w

在替换命令中,w标志将替换结果写入文件,并且该e标志以shell命令执行归属结果。r/R/w/W/e命令一样,这些必须用换行符终止。如果找到空格,注释或分号,它们将被包含在shell命令或文件名中,从而导致意想不到的结果:

$ echo a | SED的/ A / B / w1.txt#富'  b   $ LS -1  的1.txt#FOO 

4地址:选择行


4.1地址概述

地址确定sed将执行命令的哪一行以下命令替换"你好'与'世界"只在第144行:

sed'144s / hello / world /'input.txt> output.txt 

如果没有给出地址,则在所有行上执行命令。以下命令替换"你好'与'世界'在输入文件的所有行:

sed / s / hello / world /'input.txt> output.txt 

地址可以包含正则表达式,以基于内容而不是行号匹配行。以下命令替换"你好'与'世界"只有在含有"苹果":

sed'/ apple / s / hello / world /'input.txt> output.txt 

地址范围由两个以逗号(,分隔的地址指定地址可以是数字,正则表达式或两者的混合。以下命令替换"你好'与'世界"只有4到17行(含):

sed'4,17s / hello / world /'input.txt> output.txt 

!字符附加到地址规范的结尾(在命令字母之前)否定了匹配的感觉。也就是说,如果!字符遵循地址或地址范围,则仅选择与地址匹配的以下命令替换"你好'与'世界"只有包含字"苹果":

sed'/ apple /!s / hello / world /'input.txt> output.txt 

以下命令替换"你好'与'世界'仅在第1行到第3行和第18行直到输入文件的最后一行(即排除行4到17):

sed'4,17!s / hello / world /'input.txt> output.txt 

4.2按数字选择行

sed脚本中的地址可以是以下任何一种形式:

number

指定行号仅与输入中的行匹配。(请注意,sed除非在所有输入文件之间连续计数-一世 要么 -s 选项被指定。)

$

该地址与最后一个输入文件的最后一行匹配,或者每个文件的最后一行 -一世 要么 -s 选项被指定。

first~step

GNU扩展每匹配步骤个开头的行线第一特别地,当存在非负n使得当前行数等于第一 +(n *时,将选择 因此,1~2可以选择奇数行和 0~2偶数行; 从第二个开始挑选第三行,2?3"将被使用; 从十号开始选择第五行,使用'10?5"; 和'50?0"只是一个模糊的说法50

以下命令演示了步骤地址使用情况:

$ seq 10 | SED -N '0?4P'  4  8   $ 10序列| SED -N '1?3P'  1  4  7  10 

4.3通过文本匹配选择行

GNU sed支持以下正则表达式地址。默认的正则表达式是 基本正则表达式(BRE)如果-E 要么 -r使用选项,正则表达式应为扩展正则表达式(ERE)语法。BRE vs ERE

/regexp/

这将选择与正则表达式正则表达式匹配的任何行如果regexp本身包含任何/字符,则每个都必须由反斜杠(\转义

以下命令打印行 / etc / passwd文件 以"庆典' 5

sed -n'/ bash $ / p'/ etc / passwd 

空的正则表达式"//'重复上一个正则表达式匹配(如果将空的正则表达式传递给s命令,则相同)。请注意,正则表达式的修饰符将在编译正则表达式时进行求值,因此与空正则表达式一起指定它们无效。

\%regexp%

%可以由任何其他单个字符替换。)


这也与正则表达式正则表达式匹配,但允许使用不同的定界符/如果正则表达式本身包含大量斜杠,这是特别有用的,因为它避免了每一个繁琐的转义/如果regexp本身包含任何分隔符字符,则每个都必须由反斜杠(\转义

以下两个命令是等效的。他们打印以'/家庭/爱丽丝/文件/":

sed -n'/ ^ \ / home \ / alice \ / documents \ //  p'sed -n'\%^ / home / alice / documents /% p'sed -n'\; ^ / home / alice / documents /; p" 
/regexp/I \%regexp%I

I正则表达式匹配修饰符是GNU 扩展,它使得正则表达式以不区分大小写的方式匹配。

在许多其他编程语言中,小写字母i用于不区分大小写的正则表达式匹配。然而,在sed i用于插入命令(TODO:添加pxref)。

观察以下示例之间的差异。

在这个例子中,/b/I是地址:具有I 修饰符的正则表达式d是delete命令:

$ printf"%s \ n"abc | SED '/ B / ID'  一个 ? 

这里/b/是地址:正则表达式。 i是insert命令。 d是要插入的值。一条线与'?'然后插入匹配的行上方:

$ printf"%s \ n"abc | SED '/ B / ID'  一个 ?  b  ? 
/regexp/M \%regexp%M

M正则表达式匹配修饰符是GNU sed 扩展,它指示GNU sed多行模式下匹配正则表达式修饰符分别引起^$匹配换行符之后的空字符串(除正常行为之外),换行符之前的空字符串。有一些特殊的字符序列(\`\')始终与缓冲区的开头或结尾相匹配。另外,在多行模式下,句点字符与新行字符不匹配。


4.4范围地址

可以通过指定两个以逗号(,分隔的地址来指定地址范围地址范围匹配从第一个地址匹配的行开始,直到第二个地址匹配(包括):

$ seq 10 | SED -n '4,6p'  4  5  6 

如果第二个地址是一个正则表达式,然后检查结束比赛将开始与线以下,其匹配的第一个地址的行:一个范围将总是跨越至少两行(当然除了如果输入流结束时)。

$ seq 10 | SED -n '4 / [0-9] / P'  4  5 

如果第二个地址是一个小于(或等于)匹配所述第一地址的行,那么只有一条线匹配:

$ seq 10 | SED -n '4,1p'  4 

GNU sed还支持一些特殊的双地址格式; 所有这些都是GNU扩展:

0,/regexp/

0可以在地址规范中使用 行号,以便在第一个输入行中尝试匹配正则 表达式换句话说, 类似于,除了如果addr2与输入的第一行匹配,则 表单将认为其结束范围,而形式将匹配其范围的开始,因此使范围跨度达到第二次出现的正则表达式。 0,/regexp/sed0,/regexp/1,/regexp/0,/regexp/1,/regexp/

请注意,这是唯一0地址有意义的地方; 没有第0行和命令0 以任何其他方式给出地址将给出错误。

以下示例说明从地址1和0开始的区别:

$ seq 10 | SED -n '1,/ [0-9] / P'  1  2   $ SEQ 10 | SED -n '0,/ [0-9] / P'  1 
addr1,+N

匹配ADDR1?以下行ADDR1

$ seq 10 | SED -N '6,+ 2P'  6  7  8 

addr1可以是行号或正则表达式。

addr1,~N

匹配addr1addr1 之后的行,直到输入行号为N的倍数的下一行以下命令从第6行开始,直到下一行为4的倍数(即第8行):

$ seq 10 | SED -n '6,?4P'  6  7  8 

addr1可以是行号或正则表达式。


5正则表达式:选择文本


5.1正则表达式概述 sed

要知道如何使用sed,人们应该了解的正则表达式(正则表达式的简称)。正则表达式是从左到右匹配主题字符串的模式。大多数字符是 普通的:它们代表自己的模式,并且匹配相应的字符。正则表达式在sed两个斜杠之间指定。

以下命令打印包含单词"你好":

sed -n'/ hello / p' 

上面的例子相当于这个grep命令:

grep'你好 

正则表达式的力量来自于在模式中包含替代和重复的能力。这些是通过使用特殊字符在模式中编码的,这些字符不代表自己,而是以某种特殊方式进行解释。

^正则表达式中的字符(插入符号)与行的开头匹配。字符.(点)匹配任何单个字符。以下sed命令匹配并打印以字母"b',其次是任何一个字符,其次是字母'?":

$ printf"%s \ n"abode bad bed bit bid byte body | sed -n'/ ^ bd / p'  招标 机构 

以下部分说明正则表达式中特殊字符的含义和用法。


5.2基本(BRE)和扩展(ERE)正则表达式

基本和扩展正则表达式是指定模式语法的两个变体。基本正则表达式(BRE)是sed(和类似的)中的默认值grep扩展正则表达式语法(ERE)被激活-r 要么 -E选项(和类似地,grep -E)。

GNU中 sed,基本和扩展正则表达式的唯一区别在于几个特殊字符的行为:'''+',括号,大括号('{}'),和'|"。

使用基本(BRE)语法,这些字符没有特殊的含义,除非前缀反斜杠('\"); 虽然使用扩展(ERE)语法是相反的:这些字符是特殊的,除非它们带有反斜杠('\")。

所需模式基本(BRE)语法扩展(ERE)语法
文字'+'(加号)
$ echo"a + b = c"| sed -n'/ a + b / p'a  + b = c 
$ echo"a + b = c"| sed -E -n'/ a \ + b / p'a  + b = c 
一个或多个 '一个'字符后跟'b'(加号作为特殊元字符)
$ echo"aab"| sed -n'/ a \ + b /  p'aab 
$ echo"aab"| sed -E -n'/ a + b /  p'aab 

5.3基本正则表达式语法概述

以下是正则表达式语法的简要说明sed

char

一个普通字符与自己相匹配。

*

匹配上一个正则表达式的零个或多个匹配实例的序列,该正则表达式必须是普通字符,前缀为\a .,分组的正则表达式(见下文)或括号表达式的特殊字符作为GNU扩展,后缀正则表达式也可以后跟*; 例如,a**相当于a* POSIX 1003.1-2001表示,*当它出现在正则表达式或子表达式的开始时,它代表自身,但是许多非GNU实现不支持这一点,便携式脚本应该\*在这些上下文中使用

.

匹配任何字符,包括换行符。

^

匹配模式空间开始处的空字符串,即,在模式空格开始之后,必须显示出来的内容。

在大多数脚本中,模式空间被初始化为每行的内容(请参阅如何sed工作)。所以,这是一个有用的简化,认为是^#include只匹配线,#包括'是线上的第一件事 - 如果以前有空格,比如匹配失败。只要模式空间的原始内容不被修改,例如使用s命令,这种简化是有效的

^仅在正则表达式或子表达式(即,之后\( 之后\|的开始处作为特殊字符^尽管如此,便携式脚本在子表达式开始时应避免,因为POSIX允许^在该上下文中将其视为普通字符。

$

它是一样的^,而是指模式空间的结尾。 $也只能在正则表达式或子表达式(即,之前\) 之前\|的结尾处作为特殊字符,并且在子表达式结尾处的使用不可移植。

[list] [^list]

匹配列表中的任何单个字符:例如, [aeiou]匹配所有元音。列表可以包括与(包括)char1 char2之间的任何字符匹配的序列请参阅字符类和括号表达式char1-char2

\+

因为*,但匹配一个或多个。这是一个GNU扩展。

\?

作为*,但只匹配零或一。这是一个GNU扩展。

\{i\}

As *,但是恰好匹配i序列(是一个十进制整数;为了便携性,保持在0到255之间)。

\{i,j\}

匹配ij,包括序列。

\{i,\}

匹配大于或等于i序列。

\(regexp\)

将内部正则表达式组合为一个整体,这用于:

  • 应用postfix操作符,如\(abcd\)*:这将搜索零个或多个整个序列'A B C D',同时abcd*会搜索'ABC"其次是零次或多次出现"?"。请注意,POSIX 1003.1-2001 \(abcd\)*需要支持,但许多非GNU 实现不支持它,因此它不是普遍可移植的。
  • 使用回参考(见下文)。
regexp1\|regexp2

匹配regexp1regexp2使用括号来使用复杂的替代正则表达式。匹配过程从左到右依次尝试每个替代,并且使用成功的第一个。这是一个GNU扩展。

regexp1regexp2

匹配regexp1regexp2的连接级联地结合不同于更紧密\|^ $,但较不紧密比其他正则表达式运算符。

\digit

匹配的数字\(…\)正则表达式括号子表达式。这被称为反参考子表达式通过计数\(从左到右的出现来隐含地编号

\n

匹配换行符。

\char

匹配,其中,焦炭是一个$ *.[\,或^请注意,您可以移植地假定要解释的只有C样的反斜杠序列是\n\\; 特别 \t是不便携,并且匹配'?"在大多数实现的sed,而不是制表符字符。

请注意,正则表达式匹配器是贪心的,即从左到右尝试匹配,如果从同一个字符开始可以进行两次或多次匹配,则选择最长的匹配项。

例子:

"ABCDEF"

火柴 'ABCDEF"。

"A * B"

匹配零个或多个'一个之后是一个单一的"b"。例如, 'b' 要么 'AAAAAB"。

"一\ 2 B"

火柴 'b' 要么 'AB"。

"一个\ + B \ +"

匹配一个或多个'一个其次是一个或多个'b的:'AB"是最短的匹配,但其他例子是"AAAAB' 要么 'abbbbb' 要么 'aaaaaabbbbbbb"。

"*。" "。\ +"

这两个都匹配字符串中的所有字符; 但是,第一个匹配每个字符串(包括空字符串),而第二个匹配只包含至少一个字符的字符串。

"^为主。*(。*)"

这匹配一个以'主要',其次是开口和右括号。"?''''和'"不必相邻。

"^#"

这匹配一个以'"。

"\\ $"

这将匹配以单个反斜杠结尾的字符串。正则表达式包含两个用于转义的反斜杠。

"\ $"

而是匹配一个由一个美元符号组成的字符串,因为它被转义。

"[A-ZA-Z0-9]"

在C语言环境中,它匹配任何ASCII字母或数字。

"[^ tab] \ +"

(这里tab表示单个制表符。)这匹配一个或多个字符的字符串,其中没有一个是空格或制表符。通常这意味着一个字。

"^ \(。* \)\ n \ $ 1"

这将匹配由由换行符分隔的两个相等子串组成的字符串。

"\ {9 \}一个$"

这匹配九个字符,后跟一个'一个"在一行的结尾。

"^ \ {15 \}甲"

这匹配一个包含16个字符的字符串的开头,最后一个是'一个"。


5.4扩展正则表达式语法概述

基本和扩展正则表达式的唯一区别在于几个字符的行为:'''+',括号,大括号('{}'),和'|"。虽然基本的正则表达式要求将它们转义为特殊字符,但如果您希望它们与文字字符匹配,则使用扩展正则表达式时,必须将其转义"|因为'\ |'是一个GNU扩展 - 标准的基本正则表达式不提供其功能。

例子:

abc?

成为'ABC \?'使用扩展正则表达式时。它匹配文字字符串'ABC?"。

c\+

成为'C +'使用扩展正则表达式时。它匹配一个或多个'C的。

a\{3,\}

成为'一个{3,}'使用扩展正则表达式时。它匹配三个或更多的'一个的。

\(abc\)\{2,3\}

成为'(ABC){2,3}'使用扩展正则表达式时。它匹配"ABCABC' 要么 'ABCABCABCABC ..."。

\(abc*\)\1

成为'(ABC *)\ 1'使用扩展正则表达式时。使用扩展正则表达式时,还需要转义引用引用。

a\|b

成为'A | B'使用扩展正则表达式时。它匹配'一个' 要么 'b"。


5.5字符类和括号表达式

括号表达式是由包围字符的列表'['和']"。它匹配该列表中的任何单个字符; 如果列表的第一个字符是插入符号'^',那么它匹配任何不在列表中的字符例如,以下命令将替换"灰色' 要么 '灰色'与'蓝色":

sed的/ gr [ae] y / blue /' 

括号表达式可用于 基本扩展 正则表达式(即,带或不带-E/-r 选项)。

在括号表达式中,范围表达式由用连字符分隔的两个字符组成。它匹配在两个字符之间排序的任何单个字符(包括)。在默认的C语言环境中,排序顺序是本地字符顺序; 例如, '[广告]'相当于'[A B C D]"。

最后,某些命名类的字符是在括号表达式中预定义的,如下所示。

这些命名类必须括号内使用正确使用:

$ echo 1 | sed's / [[:digit:]] / X /'  X 

不正确的使用被较新的sed版本拒绝旧版本接受它,但将其视为单括号表达式(相当于"[DGIT:]',也就是只有字符d / g / i / t /:)

#当前的GNU sed版本 - 不正确的使用被拒绝 $ echo 1 | sed的/ [:digit:] / X /'  sed:字符类的语法是[[:space:]],而不是[:space:]   #旧的GNU sed版本 $ echo 1 | sed / s / [:digit:] / X /'  1 
"[:alnum:]"

字母数字字符: '[:α:]'和'[:数字:]"; 在里面 'C'区域设置和ASCII字符编码,这与'[0-9A-ZA-Z]"。

"[:α:]"

字母字符:'[:降低:]'和'[:上:]"; 在里面 'C'区域设置和ASCII字符编码,这与'[A-ZA-Z]"。

"[:空白:]"

空白字符:空格和制表符。

"[:CNTRL:]"

控制字符 在ASCII中,这些字符具有八进制代码000到037和177(DEL)。在其他字符集中,这些是相同的字符,如果有的话。

"[:数字:]"

数字:0 1 2 3 4 5 6 7 8 9

"[:图形:]"

图形字符:'[:alnum:]'和'[:PUNCT:]"。

"[:降低:]"

小写字母; 在里面 'C'区域设置和ASCII字符编码,这是 a b c d e f g h i j k l m n o p q r s t u v w x y z

"[:打印:]"

可打印字符:'[:alnum:]'''[:PUNCT:]'和空间。

"[:PUNCT:]"

标点符号 在里面 'C'区域设置和ASCII字符编码,这是 ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~

"[:空间:]"

空间人物:在'C'locale,这是标签,换行符,垂直标签,表单feed,回车和空格。

"[:上:]"

大写字母:在'C'区域设置和ASCII字符编码,这是 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

"[:xdigit:]"

十六进制数字: 0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f

请注意,这些类名称中的括号是符号名称的一部分,除了括号表达式的括号之外,还必须包含它们。

大多数元字符在括号表达式中丧失其特殊含义:

"]"

如果不是第一个列表项,则结束括号表达式。所以,如果你想让']'字符是一个列表项,你必须把它放在第一位。

" - "

表示范围,如果它不是列表中的第一个或最后一个或范围的终点。

"^"

表示不在列表中的字符。如果你想让'^'字符列表项,放在任何地方,但首先。

TODO:并入本段(从BRE部分逐字复制)。

字符$*.[,和\ 通常不中的特殊列表例如,[\*] 匹配"\' 要么 '*'因为\这里不是特别的。然而,字符串等[.ch.][=a=] [:space:]是内特殊列表和表示对照的符号,等价类,和字符类,分别和 [因此特别内列表时,它后面是 .=,或:此外,在不 POSIXLY_CORRECT模式,特殊的逃逸喜欢\n \t内确认名单看到逃生

"["

表示开放的整理符号。

"]"

代表紧密整理符号。

"[="

表示开放等价类。

"=]"

代表密切的等价类。

"[:"

表示打开的字符类符号,后面应该有一个有效的字符类名称。

":]"

代表关闭字符类符号。


5.6正则表达式扩展

以下序列在正则表达式中具有特殊含义(在地址s命令中使用)。

这些可以用于 基本扩展 正则表达式(即,使用或不使用-E/-r 选项)。

\w

匹配任何"单词"字符。"字"字符是任何字母或数字或下划线字符。

$ echo"abc% -  = def"。| sed / / w / X /  g'XXX% -  = XXX。 
\W

匹配任何"非字"字符。

$ echo"abc% -  = def"。| sed的/ \ W / X /  g'abcXXXXXdefX 
\b

匹配单词边界; 如果左边的字符是"字"字符,并且右边的字符是"非字"字符,则反之亦然。

$ echo"abc% -  = def"。| sed的/ \ b / X /  g'XabcX% -  = XdefX。 
\B

匹配到处都是字边界; 如果左边的字符和右边的字符既是"字"字符也可以是"非字"两个字符,那就是匹配。

$ echo"abc% -  = def"。| sed的/ \ w / X /  g'aXbXc X%XX = X dXeXf.X 
\s

匹配空格字符(空格和制表符)。嵌入模式/保持空格的换行符也将匹配:

$ echo"abc% -  = def"。| sed / s / X /  g'abcX% -  = Xdef。 
\S

匹配非空格字符。

$ echo"abc% -  = def"。| sed的/ \ w / X /  g'XXX XXX XXXX 
\<

匹配一个单词的开头。

$ echo"abc% -  = def"。| sed's / \ 
      
    
0