该文件记录GNU 版本4.4 sed,一个流编辑器。
创新互联服务项目包括龙里网站建设、龙里网站制作、龙里网页制作以及龙里网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,龙里网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到龙里省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
版权所有©1998-2017自由软件基金会
授权根据GNU自由文件许可证1.3版或自由软件基金会发布的任何更新版本的条款复制,分发和/或修改本文档; 没有不变的部分,没有封面文本,也没有封底文本。许可证的副本包含在题为“GNU自由文件许可证”的部分。
? 介绍: | 介绍 | |
? 调用sed: | 调用 | |
? sed脚本: | sed 脚本 | |
? sed地址: | 地址:选择行 | |
? sed正则表达式: | 正则表达式:选择文本 | |
? 高级sed: | 高级sed:循环和缓冲区 | |
? 示例: | 一些示例脚本 | |
? 限制: | GNU的限制和(非)限制 sed | |
? 其他资源: | 其他资源用于学习 sed | |
? 报告错误: | 报告错误 | |
? GNU免费文档许可证: | 复制并分享本手册 | |
? 概念指标: | 本手册中包含所有主题的菜单。 | |
? 命令和选项索引: | 具有所有sed命令和命令行选项的菜单。 |
sed是一个流编辑器。流编辑器用于对输入流(文件或流水线的输入)执行基本文本转换。虽然在某些方面类似于允许脚本编辑(例如ed) 的编辑器,sed只能通过输入一次,但效率更高。但是,它有sed能力在管道中过滤文本,特别区别于其他类型的编辑器。
本章介绍如何运行sed。sed 脚本和单个sed命令的详细信息将在下一章讨论。
? 概述: | ||
? 命令行选项: | ||
? 退出状态: |
通常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
调用的完整格式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, - 表达, 要么 - 文件 选项在命令行中给出,则命令行上的第一个非选项参数被视为要执行的脚本。
如果在处理上述内容后仍有任何命令行参数,这些参数将被解释为要处理的输入文件的名称。 文件名“ - '指标准输入流。如果没有指定文件名,将处理标准输入。
退出状态为零表示成功,非零值表示失败。GNU sed返回以下退出状态错误值:
0成功完成
1无效的命令,无效的语法,无效的正则表达式或与之一起使用的 GNU sed扩展命令--posix。
2在命令行上指定的一个或多个输入文件无法打开(例如,如果找不到文件或拒绝读取权限)。处理继续与其他文件。
4I / O错误或运行时严重的处理错误, GNU sed立即中止。
另外,该命令q和Q可用于终止 sed与自定义退出代码值(这是一个GNU sed扩展名):
$ echo |sed'Q42';echo $? 42
? sed脚本概述: | sed 脚本概述 | |
? sed命令列表: | sed 命令摘要 | |
? “s”命令: | sed的瑞士军刀 | |
? 常用命令: | 经常使用的命令 | |
? 其他命令: | 不常用的命令 | |
? 编程命令: | sed大师 命令 | |
? 扩展命令: | 特定于GNU的命令 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,由于它们的语法,不能被随后工作作为命令分隔符分号,因此应当用换行被终止或者被放置在的末端脚本或脚本文件。命令之前也可以带有可选的非空白字符。请参阅多命令语法。
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)。
该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在多行模式下匹配正则表达式。修饰符分别引起^和$匹配换行符之后的空字符串(除正常行为之外),换行符之前的空字符串。有一些特殊的字符序列(\`和\')始终与缓冲区的开头或结尾相匹配。另外,在多行模式下,句点字符与新行字符不匹配。
如果你完全使用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
打印图案空间(到标准输出)。此命令通常仅与该命令配合使用-n 命令行选项。
示例:仅打印第二个输入行:
$ seq 3 |sed -n 2p 2
如果未禁用自动打印,请打印图案空间,然后,无论如何使用下一行输入替换图案空间。如果没有更多的输入,则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
一组命令可之间被封闭 {和}字符。当您希望通过单个地址(或地址范围)匹配来触发一组命令时,这特别有用。
示例:执行替换然后打印第二个输入行:
$ seq 3 |sed -n'2 {s / 2 / X /;p}' X
虽然可能比上一节更少使用,但是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