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

本章介绍如何运行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.txtsed --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立即中止。

另外,该命令q和Q可用于终止 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 

命令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 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
网站标题:sed4.4手册
本文路径:http://hbruida.cn/article/ieogoe.html