sed 命令的man文档
用途
提供流编辑器。
语法
sed [ -n ] scrīpt [ File ... ]
sed [ -n ] [ -e scrīpt ] ... [ -f scrīptFile ] ... [ File ... ]
描述
sed 命令根据编辑脚本从指定的 File 参数修改行,并将结果写入标准输出。 sed 命令包含很多功能,用于选择要修改的行,并只对选择的行作更改。
sed 命令使用两个工作空间来保留修改的行:保留选择行的模式空间和暂时存储行的保留空间。
编辑脚本由单独的子命令构成,每个子命令在分离的行上。 sed 子命令的一般格式如下:
[address-range] function[modifiers]
sed 命令通过将输入行读入方式空间,依次应用所有的 sed 子命令(这些子命令的地址选择了那个行),并将方式空间写到标准输出来处理每个输入 File
参数。然后清除方式空间,并对每个在输入 File 参数中指定的行重复这个过程。一些 sed 子命令使用保留空间来保存所有或部分后继检索的模式空间。
当命令包含地址(行号或搜索模式)时,该命令只会对被寻址的行起作用。否则,该命令适用于所有的行。
地址是十进制行号、$(美元符号),它指出输入的最后行的地址或上下文地址。上下文地址是正则表达式,它与那些在 ed 命令中使用的表达式相似,不过存在下列的差别:
您可以从模式中选择字符定界符。表达式的常规格式是:
\?pattern?
其中 ? (问号)是可选择的字符定界符。除了空格或换行符,您可以从当前的语言环境中选择任何字符。只有在第一次出现 ?(问号)时才需要 \ (反斜杠) 字符。
模式的缺省格式如下:
/pattern/
\ (反斜杠) 字符不是必需的。
\n 序列与模式空间中的换行符匹配,除了终止的换行符。
。(句号)与除终止的换行符之外的任何字符匹配。也就是说,与 ed 命令不同(ed 命令不能匹配行中间的字符),sed 命令能够匹配模式空间中的换行符。
某些叫做 addressed 的命令允许您指定该命令适用的一行或多行。下列的规则适用于寻址命令:
没有地址的命令行选择每一行。
具有以上下文格式表示的地址的命令行会选择与该地址匹配的每一行。
具有以逗号分割的两个地址的命令行选择从与第一个地址匹配的第一行到与第二个地址匹配的下一行的整个范围。(如果第二个地址小于或等于第一个选择的行号,那么只会选择一行。)此后就会重复这个过程以再次寻找第一个地址。
标志
-e scrīpt使用 scrīpt 变量作为编辑脚本。如果您只使用 -e 标志,而不使用-f 标志,那么就可以省略 -e 标志。
-f scrīptFile使用 scrīptFile 变量作为编辑脚本源。 scrīptFile 变量是适用于 File
参数的一组准备好的编辑命令。
-n抑制所有正常写入标准输出的信息。
注: 您可以指定多个 -e 和 -f 标志。将所有的子命令以指定的顺序添加到脚本,而不管其来源。
sed 子命令
sed 命令包含下列的 sed 脚本子命令。子命令前的圆括号内的数字表示子命令可允许地址的最大数。
注:
伴随 a\ , c\ 以及 i\ 子命令的 Text 变量能够在不止一行上继续,提供了所有行(但是最后以引用换行符的 \ (反斜杠)
结束)。文本中的反斜杠视为与 s 命令中的替换字符串相似,并且能够用于保护初始的空格和制表符,使其免受在处理每个脚本行时被删除。 RFile 和
WFile 变量必须结束命令行,并且必须在前面有一个空格。在开始处理前创建每个 WFile 变量。
sed 命令能够处理模式文件中多达 999 个子命令。
(1) a\
Text在读取下一个输入行之前在输出中放置 Text 变量。
(2)b[label]分支具有 label 变量的 : 命令。如果 label 变量是空的,那就分支到脚本的末尾。
(2)c\
Text删除模式空间。用 0 或 1 地址或 2 地址范围的末尾,将 Text 变量放置在输出中,然后开始下一个周期。
(2)d删除模式空间,然后开始下一个周期。
(2)D删除通过第一个换行符的模式空间的初始段,然后开始下一个周期。
(2)g用保留空间的内容替换模式空间的内容。
(2)G将保留空间的内容附加到模式空间。
(2)h用模式空间的内容替换保留空间的内容。
(2)H将模式空间的内容附加到保留空间。
(1)i\
Text在将下一行读到模式空间之前将 Text 变量写到标准输出。
(2)l将模式空间写到标准输出中,它将不可显示字符显示为 4 位十六进制值。将长行折叠起来。
(2)l以视觉明确的格式将模式空间写到标准输出中。将字符 [url=]\\\[/url], [url=file://\\a]\\a[/url], [url=file://\\b]\\b[/url], [url=file://\\f]\\f[/url], [url=file://\\r]\\r[/url], [url=file://\\t]\\t[/url] 以及 [url=file://\\v]\\v[/url]
以相应的转义序列写入。以每个字节(最重要的字节首先表示)用一个三位八进制数字(前面有反斜杠字符)表示的方式写入不可打印的字符。该格式也用于多字节字符。该子命令折叠长行。其后有换行符的反斜杠表示折叠点。折叠出现在第
72 列位置。 $(美元符号)标记每行的结束。
(2)n如果不抑制缺省的输出,那就将模式空间写到标准输出。它用输入的下一行替换模式空间。
(2)N将输入的下一行附加到具有嵌入式换行符(更改当前的行号)的模式空间。您可以用它来搜索分割成两行的模式。
(2)p将模式空间写到标准输出。
(2)P将通过第一个换行符的模式空间的初始段写到标准输出。
(1)q分支到脚本的结束。它不启动新的周期。
(2)r RFile读取 RFile 变量的内容。在读取下一输入行之前将内容放置到输出。
(2)s/pattern/replacement/flags
用 replacement 字符串代替在模式空间中首次出现的 pattern
参数。除了空格或换行符,在 s 子命令之后显示的任何字符都能代替 /(斜杠)分隔符。
请参阅 ed 命令的 『模式匹配』 部分。
flags 变量的值必须是零或以下的值:
g
代替 pattern 参数所有非重叠的实例,而不只是第一个。
n
仅代替第 n 次出现的 pattern 参数。
p
如果作了替代,那就将模式空间写到标准输出。
w WFile
如果作了替代,将模式空间写到 WFile 变量。将模式空间附加到WFile 变量。如果 sed 脚本的先前写入没有创建 WFile 变量,那么
sed 命令就会创建它。
(2)tlabel如果最近读取 t 子命令的输入行时做了任何替代的话,则分支在脚本文件中的 :label 变量。如果您不指定 label
变量,那么就将控制传向脚本的末尾。
(2)wWFile将模式空间附加到 WFile 变量。
(2)x交换模式空间和保留空间的内容。
(2)y/pattern1/pattern2/
将所有 pattern1 变量中出现的字符代替为相应的 pattern2 字符。在
pattern1 和 pattern2 变量中的字符数必须相等。换行符用 \n 表示。
(2)!sed-cmd只将指定的 sed 子命令应用于没有选择地址的行。
(0):label标记 b 和 t 子命令引用的分支点。该标号可以是任何八个或更少字节的序列。
(1)=将当前行号作为一行写到标准输出。
(2){subcmd
.
.
.
}组子命令以 {} (花括号) 封装。
(0)忽略空命令。
(0)#如果 #(镑符)是出现在脚本文件的某行的第一个字符,那么就会将整个行视为注释,但有一个例外。只对脚本文件的第一行来说,如果在 # 后的字符是
n,就会抑制缺省的输出。忽略 #n 之后的行的剩余部分。
出口状态
该命令返回以下出口值:
0成功完成。
>0发生错误。
示例
要执行全局更改,输入:
sed "s/happy/enchanted/g" chap1 >chap1.new
该命令序列用单词 enchanted 代替每个在文件 chap1 中出现的单词 happy。它将已编辑的版本写入名为 chap1.new 的分离文件。s
子命令末尾的 g 字符告诉 sed 命令在每行作尽可能多的替代。如果没有 g 字符,那么 sed 命令就只会代替行中首次出现的单词 happy。
sed 命令作为过滤器操作。它从标准输入或在命令行命名的文件中(本例中是
chap1)读取文本、修改文本、并将其写入标准输出。不同于大多数的编辑器,它不替换原始文件。在流水线使用时,这会使 sed 命令成为强大的命令。
要在流水线中将 sed 命令用作过滤器,输入:
pr chap2 | sed "s/Page *[0-9]*$/(&)/" | enq
该命令序列在打印文件 chap2 之前将页码封装在括号中。pr 命令将标题和页码放置在每页的顶部,然后 sed 命令将页码放在括号中,enq
命令打印已编辑的列表。
sed 命令模式 /Page *[0-9]*$/ 与出现在行末的页码匹配。 s 子命令将其更改为 (&),其中 & 代表匹配的页码。
要显示文件的选择的行,输入:
sed -n "/food/p" chap3
sed -n 显示文件 chap3 中包含单词 food 的每一行。通常,sed 命令将编辑过的每行复制到标准输出。 -n 使 sed
命令停止这样做。然后,您使用子命令(如 p )写入文本的特定部分。如果没有 -n 标志,该示例会显示文件 chap3 中的所有行,并显示包含 food
的每个行两次。
要执行复杂的编辑,输入:
sed -f scrīpt.sed chap4 >chap4.new
当您想做复杂的事情时,该命令序列创建 sed
脚本文件。然后您在使用脚本之前就可以对其进行测试和修改。您也可以重用脚本来编辑其它文件。用交互式文本编辑器创建脚本文件。
样本 sed 脚本文件:
:join
/\\$/{N
s/\\\n//
b join
}
sed 脚本将每个以 \ (反斜杠) 结束的行连接到其后的一行。首先,模式 /\\$/ 选择以 \ 结束的行,其用于以 {} (花括号) 封装的命令组。然后
N 子命令附加下一行,嵌入换行符。 s/\\\n// 删除 \ 和嵌入的换行符。最后,b join 分支回到标号 :join 以在新连接的行末检查 \
。如果没有分支,那么 sed 命令在检查第二个 \ 之前写入连接的行并读取下一行。
注:N 子命令引起 sed 命令立刻停止,如果没有更多的输入行的话(也就是说,如果 N
子命令读取文件结束符的话)。在停止前它不将模式空间复制到标准输出。这意味着如果输入的最后行结束于 \ , 就不将其复制到输出。
要将现有的文件(oldfile)复制到新的文件(newfile),并将所有出现的 testpattern 文本字符串替换为 $REPL
外壳程序变量的内容,输入:
cat oldfile | sed -e "s/testpattern/$REPL/g" > newfile