手册页部分 1: 用户命令

退出打印视图

更新时间: 2014 年 7 月
 
 

sed(1)

名称

sed - 流编辑器

用法概要

/usr/bin/sed [-n] script [file]...
/usr/bin/sed [-n] [-e script]... [-f script_file]... 
     [file]...
/usr/xpg4/bin/sed [-n] script [file]...
/usr/xpg4/bin/sed [-n] [-e script]... [-f script_file]... 
     [file]...

描述

sed 实用程序是一个流编辑器,用于读取一个或多个文本文件,根据编辑命令脚本进行编辑更改,并将结果写入至标准输出。脚本可以从 script 操作数字符串获得,也可以从 –e script–f script_file 选项构成的选项参数组合获得。

sed 实用程序是一个文本编辑器。它无法编辑二进制文件或者包含 ASCII NUL (\0) 字符或很长行的文件。

选项

支持以下选项:

–e script

scriptsed 的一个编辑命令。有关 script 格式的更多信息,请参见下文的“用法”部分。如果只有一个 –e 选项而没有 –f 选项,可以省略标志 –e

–f script_file

script_file 获取脚本。script_file 由编辑命令构成,每行一个命令。

–n

禁止缺省输出。

可以指定多个 –e–f 选项。所有命令将按指定顺序添加到脚本,无论其源自何处。

操作数

支持下列操作数:

file

要读取和编辑其内容的文件的路径名称。如果指定多个 file 操作数,将按指定顺序读取指定文件,并将编辑串联。如果未指定 file 操作数,将使用标准输入。

script

要作为编辑命令脚本使用的字符串。应用程序提供的脚本不得违反文本文件的限制,但最后一个字符不需要是 NEWLINE 字符。

用法

脚本由编辑命令构成,每行一个命令,其形式如下:

[  address  [  ,  address  ]  ]  command  [  arguments  ]

第一个 address 之前以及 command 之前允许有零个或多个空白字符。第一个 address 之前允许有任意数量的分号。

在常规运行时,sed 会循环将一行输入(去掉结尾的 NEWLINE 字符)复制到一个模式空间(除非 D 命令后面跟有某些内容),依次应用其 address 选择了该模式空间的所有命令,然后将所得到的模式空间复制到标准输出(除非使用了 –n)并删除该模式空间。每次将模式空间写入标准输出或指定文件时,sed 会立即在其后面加上一个 NEWLINE 字符。

某些命令将使用一个保留空间来保存全部或部分模式空间,以供后续检索使用。每个模式空间保留空间都能够至少容纳 8192 个字节。

sed 地址

address 可以为空,可以是一个跨多个文件累加计算输入行计数的十进制数,一个 $(用于确定最后一行输入的位置),也可以是一个上下文地址(包含如 regexp(5) 手册页中所述的 /regular expression/)。

没有地址的命令行会选择每个模式空间。

有一个地址的命令行会选择每个与该地址匹配的模式空间。

有两个地址的命令行将从与第一个地址匹配的第一个模式空间到与第二个地址匹配的下一个模式空间的范围内进行选择(包含二者)。此后,将重复执行该过程,再次查找第一个地址。(如果表示第二个地址的数小于或等于第一个地址选择的行号,将仅选择对应于第一个地址的行)。

通常,各地址之间以逗号 (,) 分隔。也可使用分号 (;) 进行分隔。

sed 正则表达式

sed 支持 regexp(5) 手册页中介绍的基本正则表达式,并包含以下补充内容:

\cREc

在上下文地址中,\cREc 这个构造(其中 c 是指除反斜杠或换行符以外的任意字符)等同于 /RE/。如果 c 指定的字符出现在反斜杠之后,将被视为代表其原义的文本字符,而不会终止 RE。例如,在上下文地址 \xabc\xdefx 中,第二个 x 代表其本身,因此正则表达式应为 abcxdef

\n

转义序列 \n 与模式空间中嵌入的 NEWLINE 字符匹配。字面意义的 NEWLINE 字符不得用在上下文地址的正则表达式或替换命令中。

只能通过使用否定命令 ! 将编辑命令应用到未选定的模式空间(下文将予以介绍)。

sed 编辑命令

在下面所列出的函数中,指明了每个函数允许具备的最大地址数。

rw 命令可使用可选的 rfile(或 wfile)参数,并通过一个或多个空白字符与命令字母隔开。

同一个命令行中可以指定多个命令,各命令之间以分号 (;) 分隔。

text 参数包含一行或多行,所有行(最后一行除外)均以 \ 结尾,以便隐藏 NEWLINE。每个嵌入文本中的 NEWLINE 字符必须在前面加上一个反斜杠。文本中的其他反斜杠将被删除,后跟字符将按字面原义处理。文本中的反斜杠与 s 命令的替换字符串中的反斜杠处理方式相同,并且可用于防止每个脚本行的起始空格和制表符被去除。命令行必须使用 rfilewfile 参数结尾,并且参数前面必须只带一个空格。使用 wfile 参数将初次创建不存在的文件,或替换现有文件的内容。最多可以使用 10 个不同的 wfile 参数。

正则表达式可以匹配整个字符串,而不只是单个行,但 NEWLINE 字符将通过 sed RE 中的 \n 进行匹配。RE 中不允许使用 NEWLINE 字符。还要注意的是,不能使用 \n 来匹配输入行末尾处的 NEWLINE 字符;执行 N 编辑命令将导致模式空间中出现 NEWLINE 字符。

两个命令构成一个 command-list,即一个以 NEWLINE 字符分隔的 sed 命令列表,如下所示:

{ command 
command 
}

{ 前面可以有空白字符,后面可以跟空格。command 前面可以有空格。结尾的 } 前面必须带 NEWLINE 字符,并且前后可以带空白字符。大括号前后可以带空白字符。命令的前面可以带空白字符,但后面不可以跟空白字符。

下表列出了各个函数,并给出了允许使用的最大地址数。

最大地址数
命令
说明
1
a\ text
通过执行 N 命令或开始新周期来附加内容。在读取下一输入行之前将 text 置于输出中。
2
b label
转移到带 label: 命令。如果 label 为空,将转移到脚本末尾。标签具有唯一性,最多包含 8 个字符。
2
c\ text
进行更改。删除模式空间。将 text 置于输出中。开始下一个周期。
2
d
删除模式空间。开始下一个周期。
2
D
删除模式空间中直到第一个换行符的起始段。开始下一个周期。(请参见下面的 N 命令。)
2
g
将模式空间的内容替换为保留空间的内容。
2
G
将保留空间的内容附加到模式空间。
2
h
将保留空间的内容替换为模式空间的内容。
2
H
将模式空间的内容附加到保留空间。
1
i\ text
插入。将 text 置于标准输出中。
2
l
/usr/bin/sed:将模式空间以明确形式列于标准输出中。不可输出字符采用八进制记法显示,长行将折叠。
/usr/xpg4/bin/sed:将模式空间以明确形式列于标准输出中。不可输出字符采用八进制记法显示,长行将折叠。字符(\\\a, \b\f\r\t \v)将写入为对应的转义序列。未包含在该表中的不可输出字符,将按照字符中每个字节(最重要字节放在最前面)采用一个八进制三位数字(前面带一个反斜杠字符)的格式写入。如果系统中某个字节的大小大于 9 位,不可输出字符所采用的格式将取决于具体的实现。
长行将折叠,折叠点通过写入反斜杠并后跟 NEWLINE 来指明;发生折叠的长度并未指定,但应适用于输出设备。每行的末尾用一个 $ 标记。
2
n
将模式空间复制到标准输出(如果未禁止缺省输出)。使用下一行输入替换模式空间。
2
N
将下一行输入附加到嵌入有换行符的模式空间。(当前行号将改变。)如果没有下一行输入可用,N 命令动词应转移到脚本结尾处并退出,且不开始新周期,也不写入模式空间。
2
p
输出。将模式空间复制到标准输出。
2
P
将模式空间中直到第一个换行符的起始段复制到标准输出。
1
q
退出。转移到脚本结尾。不开始新周期。
2
r rfile
读取 rfile 的内容。在读取下一输入行之前,将其置于输出中。如果 rfile 不存在或无法读取,将被视作空文件处理,从而不会导致错误情况。
2
t label
测试。转移到带 label: 命令(如果自最近读取输入行或执行 t 命令后进行过任何替换)。如果 label 为空,将转移到脚本末尾。
2
w wfile
写入。将模式空间附加到 wfile。第一次出现 w 命令时,将导致 wfile 被清除。将附加对 w 命令的后续调用。每次使用 sed 命令,都会覆盖 wfile
2
x
交换模式空间和保留空间的内容。
2
! command
否定。将 command(或组,如果 command{  的话)仅应用于不是由地址选择的行。
0
: label
此命令不起任何作用;它带有 bt 命令将要转移到的 label
1
=
将当前行号作为一行置于标准输出中。
2
{command-list}
仅在选择了模式空间时执行 command-list
0
空命令将被忽略。
0
#
如果在脚本文件的某一行中,# 作为第一个字符出现,则该行整体将被视为注释,但是有一个例外:如果 # 出现在第一行,并且 # 后面的字符是 n,则会禁止缺省输出。行中 #n 后面的其余部分也将被忽略。脚本文件必须至少包含一个非注释行。
最大地址数
命令(使用 strings)和说明
2
s/regular expression/replacement/flags
替换模式空间中 regular expression 实例的 replacement 字符串。除反斜杠或换行符以外的任何字符均可代替斜杠用于分隔 RE 和替换的内容。在 RE 和替换的内容中,RE 分隔符如果在前面添加了反斜杠,本身将可以用作文本字符。
replacement 中出现的“与”符号 (&) 将替换为与 RE 匹配的字符串。可通过在 & 面添加反斜杠取消其在此上下文中的特殊含义。字符 \n(其中 n 为一个数字)将替换为对应的回溯引用表达式所匹配的文本。对于在从头至尾的 replacement 扫描中遇到的每个反斜杠 (\),以下字符将失去其特殊含义(如果有的话)。对于除 &、\ 或数字以外的任何字符要被赋予哪些特殊含义,并未特别加以规定。
通过将 NEWLINE 字符替换到行中,可以对行进行拆分。应用程序必须通过在前面添加反斜杠的方法对 replacement 中的 NEWLINE 字符进行转义。即使替换字符串与其替换的字符串完全相同,也认为执行了替换。
flags 表示零个或更多:
n n = 1 - 512。只替换第 n 次出现的 regular expression
g 全局。替换所有非重叠的 regular expression 实例,而不只是替换第一个。如果同时指定 gn,结果将不确定。
p 输出模式空间(如果已进行了替换)。
P 将模式空间中直到第一个换行符的起始段复制到标准输出。
w wfile 写入。将模式空间附加到 wfile(如果已进行了替换)。第一次出现 w 命令时,将导致 wfile 被清除。将附加对 w 命令的后续调用。每次使用 sed 命令,都会覆盖 wfile
2
y/ string1 / string2 /
转换。将 string1 中出现的所有字符替换为 string2 中的对应字符。string1string2 的字符数量必须相同,如果 string1 中的任意字符出现多次,结果将不确定。除反斜杠或 NEWLINE 以外的任何字符均可代替斜杠用于分隔字符串。在 string1string2 中,该分隔符如果在前面添加了反斜杠,本身将可以用作文本字符。例如,y/abc/ABC/ 分别将 a、b 和 c 替换为 A、B 和 C。

有关 sed 遇到大于或等于 2 GB(231 字节)文件时行为的说明,请参见 largefile(5)

示例

示例 1 sed 脚本示例

sed 脚本模拟 BSD cat –s 命令,并压缩标准输入中多余的空白行。

sed −n '
# Write non-empty lines.
/./     {
        p
        d
        }
# Write a single empty line, then look for more empty lines.
/^$/        p
# Get next line, discard the held <newline> (empty line),
# and look for more empty lines.
:Empty
/^$/        {
        N
        s/.//
        b Empty
        }
# Write the non-empty line before going back to search
# for the first in a set of empty lines.
        p
'

环境变量

有关影响 sed 执行的以下环境变量的描述,请参见 environ(5):LANG、LC_ALL、LC_COLLATE、LC_CTYPE、LC_MESSAGES 和 NLSPATH。

退出状态

将返回以下退出值:

0

成功完成。

>0

出现错误。

属性

有关下列属性的说明,请参见 attributes(5)

/usr/bin/sed

属性类型
属性值
可用性
system/core-os
CSI
Not enabled(未启用)

/usr/xpg4/bin/sed

属性类型
属性值
可用性
system/xopen/xcu4
CSI
Enabled(已启用)
接口稳定性
Committed(已确定)
标准
请参见 standards(5)

另请参见

awk(1)ed(1)grep(1)attributes(5)environ(5)largefile(5)regexp(5)standards(5)