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自由文件许可证"的部分。
? 介绍: | 介绍 | |
? 调用sed: | 调用 | |
? sed脚本: | sed 脚本 | |
? sed地址: | 地址:选择行 | |
? sed正则表达式: | 正则表达式:选择文本 | |
? 高级sed: | 高级sed:循环和缓冲区 | |
? 示例: | 一些示例脚本 | |
? 限制: | GNU的限制和(非)限制 sed | |
? 其他资源: | 其他资源用于学习 sed | |
? 报告错误: | 报告错误 | |
? GNU免费文档许可证: | 复制并分享本手册 | |
? 概念指标: | 本手册中包含所有主题的菜单。 | |
? 命令和选项索引: | 具有所有sed命令和命令行选项的菜单。 |
1简介
sed是一个流编辑器。流编辑器用于对输入流(文件或流水线的输入)执行基本文本转换。虽然在某些方面类似于允许脚本编辑(例如ed) 的编辑器,sed只能通过输入一次,但效率更高。但是,它有sed能力在管道中过滤文本,特别区别于其他类型的编辑器。
2运行sed
本章介绍如何运行sed。sed 脚本和单个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将输出写入标准输出。使用-一世在现场编辑文件而不是打印到标准输出。又见W和s///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。
--posixGNU 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在命令行上指定的一个或多个输入文件无法打开(例如,如果找不到文件或拒绝读取权限)。处理继续与其他文件。
4I / O错误或运行时严重的处理错误, GNU sed立即中止。
另外,该命令q和Q可用于终止 sed与自定义退出代码值(这是一个GNU sed扩展名):
$ echo | sed'Q42'; echo $? 42
3个sed脚本
? sed脚本概述: | sed 脚本概述 | |
? sed命令列表: | sed 命令摘要 | |
? "s"命令: | sed的瑞士军刀 | |
? 常用命令: | 经常使用的命令 | |
? 其他命令: | 不常用的命令 | |
? 编程命令: | sed大师 命令 | |
? 扩展命令: | 特定于GNU的命令 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
命令a,c,i,由于它们的语法,不能被随后工作作为命令分隔符分号,因此应当用换行被终止或者被放置在的末端脚本或脚本文件。命令之前也可以带有可选的非空白字符。请参阅多命令语法。
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, t,T)。
3.3 s命令
该s命令(如替代)可能是最重要的sed,有很多不同的选择。该s命令的语法是's / regexp / replacement / flags"。
它的基本概念很简单:该s命令尝试将模式空间与提供的正则表达式regexp匹配; 如果匹配成功,则匹配的模式空间的那部分被替换替换。
有关regexp语法的详细信息,请参阅正则表达式地址。
所述替换可以包含(?是一个从1到9,包括端点)的引用,这指的是包含在之间的匹配的所述部分?个 及其匹配。此外,替换可以包含 引用模式空间的整个匹配部分的未转义字符。 \n\(\)&
该/ 字符可通过任何给定的内的任何其他单个字符被均匀地取代s命令。的/ 字符(或任何其他字符代替它使用)可以在出现正则表达式或替换 仅当它是由前面\的字符。
最后,作为一个GNU sed扩展,可以包括由一个反斜杠和一个字母的特殊序列 L,l,U,u,或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如果进行替换,则打印新的图案空间。
注意:当指定了选项p和e选项时,两者的相对排序产生非常不同的结果。一般来说,ep(评估然后打印)是你想要的,但另一方面操作可能对调试是有用的。因此,当前版本的GNU sed特别解释p了前后选项的存在,e在评估之前和之后 打印模式空间,而一般来说,该s命令的标志只显示一次。尽管如此,这种行为可能会在将来的版本中发生变化。
w filename如果进行替换,则将结果写入命名文件。作为GNU sed扩展,支持两个特殊的文件名值:的/ dev /标准错误,将结果写入标准错误,以及 的/ dev /标准输出,写入标准输出。3
e该命令允许从shell命令将输入管道转换为模式空间。如果进行替换,则执行在模式空间中找到的命令,并将其空格替换为其输出。尾随的换行被压制; 如果要执行的命令包含NUL字符,则结果未定义。这是一个GNU sed扩展。
I iI正则表达式匹配的修饰符是一个GNU 扩展,它使sed匹配正则表达式以不区分大小写的方式。
M mM正则表达式匹配的修饰符是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 3p
打印图案空间(到标准输出)。此命令通常仅与该命令配合使用-n 命令行选项。
示例:仅打印第二个输入行:
$ seq 3 | sed -n 2p 2n
如果未禁用自动打印,请打印图案空间,然后,无论如何使用下一行输入替换图案空间。如果没有更多的输入,则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
的{,},b,t,T,:命令可以用分号分隔(这是一个非便携式GNU sed扩展名)。
$ seq 4 | sed'{1d; 3d}' 2 4 $ seq 6 | SED '{1D; 3D};图5d' 2 4 6
在使用的标签b,t,T,:指令被读取,直到一个分号。领先和尾随的空白被忽略。在下面的例子中,标签是"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需要换行符的命令
以下命令不能用分号分隔,需要换行符:
a,c,i(追加/变更/插入)所有字符以下a,c,i命令被作为追加/变更/插入的文本。使用分号会导致不良结果:
$ seq 2 | sed'1aHello; 2D" 1 您好; 2d 2
使用命令分开 -e 或换行:
$ seq 2 | sed -e 1aHello -e 2d 1 Hello $ seq 2 | SED '1aHello 2D' 1 你好
请注意,指定要添加的文本('你好")后a,c,i本身就是一个GNU sed扩展。符合POSIX标准的便携式解决方案是:
$ seq 2 | SED '1A \ 你好 2D' 1 你好# (评论)
所有字符"#直到下一个换行符被忽略。
$ seq 3 | sed'#这是一个评论; 2D" 1 2 3 $ SEQ 3 | SED '#这是一条评论 2D' 1 3r,R,w,W(读取和写入文件)
的r,R,w,W命令解析的文件名,直至行尾。如果找到空格,注释或分号,它们将被包含在文件名中,导致意想不到的结果:
$ 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在自动忽略读/写错误 r,R,w,W命令(如文件丢失)。在以下示例中,sed尝试读取名为"hello.txt; ?"。文件丢失,错误被忽略:
$ echo x | sed'1rhello.txt; N" Xe (命令执行)
e命令之后的任何字符直到行尾都将发送到shell。如果找到空格,注释或分号,它们将被包含在shell命令中,导致意想不到的结果:
$ echo a | SED '1E触摸富#酒吧' 一个 $ LS -1 富#酒吧 $回显| sed'1e touch foo; s / a / b /' sh:1:s / a / b /:找不到 as///[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' 1addr1,+N
匹配ADDR1和?以下行ADDR1。
$ seq 10 | SED -N '6,+ 2P' 6 7 8
addr1可以是行号或正则表达式。
addr1,~N匹配addr1和addr1 之后的行,直到输入行号为N的倍数的下一行。以下命令从第6行开始,直到下一行为4的倍数(即第8行):
$ seq 10 | SED -n '6,?4P' 6 7 8
addr1可以是行号或正则表达式。
5正则表达式:选择文本
? 正则表达式概述: | 正则表达式概述 sed | |
? BRE vs ERE: | 基本(BRE)和扩展(ERE)正则表达式语法 | |
? BRE语法: | 基本正则表达式语法概述 | |
? ERE语法: | 扩展正则表达式语法概述 | |
? 字符类和括号表达式: | ||
?正则表达式扩展: | 附加正则表达式命令 | |
? 反向引用和子表达式: | 反向引用和子表达式 | |
? 逃离: | 指定特殊字符 | |
? 区域注意事项: |
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\}匹配i和j,包括序列。
\{i,\}匹配大于或等于i序列。
\(regexp\)将内部正则表达式组合为一个整体,这用于:
- 应用postfix操作符,如\(abcd\)*:这将搜索零个或多个整个序列'A B C D',同时abcd*会搜索'ABC"其次是零次或多次出现"?"。请注意,POSIX 1003.1-2001 \(abcd\)*需要支持,但许多非GNU 实现不支持它,因此它不是普遍可移植的。
- 使用回参考(见下文)。
匹配regexp1或regexp2。使用括号来使用复杂的替代正则表达式。匹配过程从左到右依次尝试每个替代,并且使用成功的第一个。这是一个GNU扩展。
regexp1regexp2匹配regexp1和regexp2的连接。级联地结合不同于更紧密\|,^和 $,但较不紧密比其他正则表达式运算符。
\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 / \