标签: Linux sed 4.5版本 参考文档 帮助文档 全文翻译 随带20个示例 详细解析
版权声明:本文为博主原创译文,未经博主允许不得转载。https://blog.csdn.net/qq_39785418/article/details/89765003
程序由一个或多个sed命令组成,这些命令通过一个或多个“-e”、“-f”、“–expression”和“–file”选项后的参数传入,或者如果没有这些选项,则sed命令由第一个非选项参数传入命令或者脚本。本文档将引用“这些”sed脚本;这意味着按顺序连接所有传入的脚本和脚本文件。见第2.1节[概述]。
sed命令遵循以下语法:
[addr]X[options]
X是一个单字符的sed命令占位符。[addr]是一个可选的行地址。如果指定了[addr],命令X只只会在匹配的行上执行。[addr]可以是一个单独的行号、一个正则表达式或者一系列连续的行范围——地址范围(参见第4章[sed地址])。[options]是用在某些sed命令的选项。
下面的例子删除了输入文件的第30行到35行(含30、50)。“30, 35”是一个地址范围。d(delete)是删除命令:
sed ’30, 35d’ input.txt > output.txt
下面的例子打印所有的输入行,直到匹配以‘foo’单词开头的行为止。如果找到了这样的行,sed会中止,退出状态码为42。如果找不到这样的行,同时没有发生其他错误,sed会退出,退出状态码是0。以双斜杆包围的表达式“/^foo/”是一个正则表达式,q(quit)是退出命令,42是该命令的选项。
sed ‘/^foo/q42’ input.txt > output.txt
脚本中或脚本文件中的命令可以用分号(;)或换行(ASCII 10)分隔。也可以使用‘-e’或‘-f’选项指定多个脚本。
下面的例子都是等价的。它们完成两个sed操作:逐行执行,先删除匹配正则表达式“/^foo/”的行;再用‘world’替换行中的第一个出现的‘hello’(如果有的话):
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 # 把脚本写入文件中
ehco ‘s/hello/world/’ >> script.sed # 把脚本追加到文件中
sed -f script.sed input.txt > output.txt
echo ‘s/hello/world/’ > script2.sed
sed -e ‘/^foo/d’ -f script2.sed input.txt > output.txt
由于a、c、i(译者:append追加、change替换、insert插入)命令语法的原因,它们后面不能使用跟随分号(;)作为命令之间的分隔,所以,应该用换行作为这些命令的分隔,或者把它们放在脚本或者脚本文件的最后。命令前面也可以有可选的不重要的空白字符。参见3.8节[多命令语法]。
GNU sed提供下列命令。其中一些是POSIX命令,另外的是GNU的扩展。有关每个命令的细节和例子在后面的章节中详述。(助记法)显示在括号中。
a\
text (append追加)在行的后面追加文本(text)。
a text 在行的后面追加文本(这是GNU扩展的替代语法)。
b label (branch分支)程序无条件地跳转到标签(label)位置。标签可以省略,在这种情况下,将开始下一轮循环。
c\
text (change改变、替换)用文本(text)替换或者改变整行。
c text 用文本(text)替换或者改变行(这是GNU扩展的替代语法)。
d (delete删除)删除模式空间内容,立即开始下一轮循环。(译者:sed一共有两个工作空间:其中的一个是活动
的模式空间,可以把它理解成常规的工作区、缓冲区)
D 如果模式空间中已经有换行符,则删除模式空间中第一个换行符及其前面的文本,然后,在没有从输入文件中
读取下一输入行情况下,伴随当前模式空间中留存的内容开始新一轮循环。
如果模式空间中没有换行符,则删除空间的内容,启动新一轮循环,这与执行d命令效果一样。
e (execute执行)执行在模式空间中找到的命令,用命令执行后的输出结果替换模式空间中的内容,并去掉行尾
的换行符。
e command
执行命令(command)并将其输出发送到输出流。该命令可以跨多行执行,除了最后以反斜杠结尾的行例外。
F (filename文件名)打印当前输入文件的文件名称(以一个换行符结尾)。
g (译者:由于p字符用于打印print,所以只能选用其他字符代表模式空间pattern space),用保持空间的内容
替换模式空间的内容。
(译者:保持空间是sed中另一个空间,起辅助作用,另一个缓冲区)
G 在模式空间中内容后先追加一个换行符,再追加保持空间中的内容。
h (hold space保持空间)用模式空间中的内容替换保持空间的内容。
H 在保持空间中先追加一个换行符,再追加模式空间中的内容。
i\
text (insert插入)在当前行的前面插入文本(text)。
i text 在当前行的前面插入文本(这是GNU扩展的替代语法)。
l (译者:list列表)以可视的形式打印模式空间的内容。(译者:这形式是指将不可打印的字符打印成可显示
的C语言式样的
转义字符,例如相应的转义序列打印成字符 \a、\b、\f、\r、\t和\v等,用“\”表示换行,并在打印行的结尾
添加一个“$”。)
n (next下一轮循环)如果自动打印没有禁用(译者:即没有指定‘-n’选项),先打印模式空间的内容,然后,
无论如何,从输入文件中读取下一行替换模式空间。如果没有更多的输入,那么sed会在不处理任何更多的
命令情况下退出。
N 模式空间内容中先追加一个换行符,再追加从输入文件中读取的下一行内容。如果没有更多的输入,那么sed
会在不处理更多的命令情况下退出。
p (print打印小写p)打印模式空间的内容。
P 打印模式空间中第一个换行符及其前面的内容。
q[exit-code]
(quit退出,exit-code退出码)打印模式空间后不处理更多的命令后退出sed。
Q[exit-code]
该命令与q命令一样,但是不会打印模式空间的内容。和q命令一样,它提供了返回一个退出码给调用者的能力。
r filename
(read读取)读入以‘filename’为文件名的文件。
R filename
把要读入的文件排成一队,并在当前循环结束后或者在读取下一行输入时插入输出流中。
s/regexp/replacement/[flags]
(substitute替换)用搜索模式的正则表达式(regexp)去匹配模式空间中的内容。如果匹配成功,就用替换部分
(repalcement)替换匹配到的部分。
t label (test测试)只有在当前行上执行上一个s命令替换成功,或者,条件分支被执行,程序才会跳到标签(label)处。
标签如果省略,开始下一轮循环。
T label 只有在当前行上执行上一个s命令替换失败,或者,条件分支被执行,程序才会跳到标签(label)处。标签如果
省略,开始下一轮循环。
v[version]
(version版本)该命令啥事不做,但是如果GNU sed扩展不支持,会使sed失败,或者要求的版本(version)无效。
w filename
(write写)把模式空间的内容写到以‘filename’为文件名的文件中。
W filename
把模式空间中的第一个换行符及其前面的内容写到以filename为文件名的文件中。
x (exchange交换)交换保持空间和模式空间的内容。
y/src/dst/
(译者:由于t字符用于测试test命令,所以只能选用其他单字符)如果模式空间中的内容匹配源字符集
(src)中的字符,则逐个转换为目标字符集(dst)对应的字符。(译者:该命令的功能与shell中的tr转换命令
类似,注意其内部不能使用正则表达式)
z (zap清空)该命令清空模式空间中的内容。
# 代表:#及其后面、换行符之前的内容都是注释。
{ cmd ; cmd . . . }
将多个命令组合在一起,形成命令组。
= 打印当前输入行的行号,并换行。
: label 为分支命令(b表示无条件分支; t、T表示条件分支)指定跳转标签(label)的位置。
替换命令s(substitute的缩写)可能是sed中最重要的命令,它有许多选项。s命令的语法是:
‘s/regexp/replacement/flags’。
它的基本概念是简单的:s命令试图用搜索正则表达式(regexp)去匹配模式空间;如果匹配成功,那么就用替换部分(replacement)替换模式空间中匹配的部分。
正则表达式语法的细节参考4.3节[正则表达式地址]。
替换部分可以包含表达式‘\n’反向引用(n是一个从1到9的数字,包含1和9),‘\n’表示引用正则表达式匹配的第n个左右圆括号“(, )”包围的部分。此外,替换部分可以包含未转义的‘&’字符,它引用模式空间中的匹配部分的全部。
在任何给定的s替换命令中,三个‘/’字符可以统一变更为任何其他单个字符(译者:例如,s/foo/bar/ --> s$foo b a r bar bar)。如果在正则表达式或者替换内容中出现‘/’字符(或者其他替代字符),那么,在这个字符前面必须添加一个‘\’字符进行转义。(译者:所以如果正则表达式或者替换内容中有较多的‘/’字符,最好采用其它字符,这样不需要加‘\’来转义。例如s&foo/haha&bar/xixi&)。
最后,作为GNU sed扩展,您可以包括有一个‘\’和一个字符组成的序列,这个字符只能是 L、l、U、u或E中的一个。具体含义如下:
\L (lowercase小写)在遇到‘\U’或者‘\E’以前,把替换内容(replacement)全部转化成小写。
\l (lowercase小写)把下一个字符转换成小写。
\U (uppercase大写)在遇到‘\L’或者‘\E’以前,把替换内容全部转化成大写。
\u (uppercase大写)把下一个字符换成大写。
\E (end停止)终止由‘\L’或者‘\U’开始的大小写转换。
当使用g(global全局)标志(flag)时,大小写转换会从正则表达式的一个匹配传播到另一个。(译者:这里原文有错误,原文表示相反的意思。)例如,在模式空间中包含字符串“a-b-”下,执行以下命令时:
echo ‘a-b-‘ | sed ‘s/\(b\?\)-/x\u\1/g’
输出是“axxB”。当替换第一个匹配项‘-’为‘x’时,‘\u’序列只影响由‘\1’反向引用的空字符,在替换第二个匹配项‘b-’为‘xB’时,不会影响前面已经加到模式空间的‘x’。
【 译者:在基础正则表达式中,(、?、 )含义解释如下:使用“(”和“)”包围的内容,称为子表达式,起分组的作用,如果是第一个分组,可以使用“\1”反向引用;‘?’表示前面的字符可以出现0次或者1次。所以在s命令中,这个正则表达式第一次会匹配第一个‘-’ ,第二次会匹配‘b-’,所以,‘\1’分别引用匹配到的子表达式‘’和‘b’。如果使用“-E”扩展正则表达式,可以少用几个反斜杠:
echo ‘a-b-‘ | sed -E ‘s/(b?)-/x\u\1/g’
如果有了g标志,表示全局,全部替换每个匹配项。如果没有g标志,只会替换出现的第一个匹配项:
echo ‘a-b-‘ | sed ‘s/\(b\?\)-/x\u\1/’
输出是axb-。
】
另一方面,如果含有‘\l’和‘\u’的替换内容中含有“\n”匹配的内容为空的空替换,则‘\l’和‘\u’会影响替换文本的后面的字符。在模式空间中使用‘a-b-’时,以下命令:
echo 'a-b-' | sed 's/\(b\?\)-/\u\1x/g'
输出是aXBx。大写X替换第一个‘-’和 Bx替‘b-’。如果此行为不是您要的,则可以通过在‘\1’之后添加‘\E’序列来阻止此行为。
要想在最终替换文本中包含字面意义的‘\、&、或换行符’,请确保在替换文本字符前面添加反斜杠,即成“\”、“&”、“\n”。
s命令可以跟随下列0个或0个以上的标志:
g (global全局)替换应用于匹配regexp的所有项,而不仅仅是第一匹配项。
number 只替换第number个匹配regexp项。
注意:在与s命令交互时,当您同时使用g和number标志时,POSIX标准没有指定应该发生什么,并且当前在各个sed版本
实现中没有取得一直意见。对于GNU sed而言,对这种情况的交互是:忽略第number个前面的匹配项,匹配和替换
第number个及其后面的匹配项。
p (print打印)如果替换成功,则打印替换成功后的模式空间内容。
注意:当同时指定了p和e选项,这两个选项的相对次序不同产生非常不同的结果。一般而言,“ep”(译者:先执行模式空间
找到的命令后打印)是您想要的,但是,反过来操作对于调试很有用。正因如此,当前GNU sed版本对在e之前和之后是否
存在p标志作特别解释,即在执行之前打印和执行之后打印模式空间。而在一般情况下,s命令的标志会只显示它们的
效果一次。尽管有文档记录,但这种行为在未来的版本中可能会改变。
w filename
(write写)如果s命令替换成功,那么把替换后的结果写出到以filename为文件名的文件中。作为GNU sed扩展,提供了
两种特殊的文件名:“/dev/stderr”,把结果打印到标准错误;“/dev/stdout”,把结果打印到标准输出。(如果
没有使用‘-i’,与p命令等价)
e (execute执行)此命令允许将shell命令通过管道输入并传输到模式空间,如果s命令替换成功,e执行在模式空间中找到
的命令,并用执行命令输出结果替换模式空间,尾随的换行符被抑制;如果要执行的命令包含nul字符,则结果未定义。
该标志是GNU sed扩展。
I
i (insensitive不敏感)用I修饰正则表达式的匹配是GNU sed的扩展,它使sed以不区分大小写的方式匹配正则表达式
(regexp)。
M
m (multi-line多行)用M修饰正则表达式的匹配是GNU sed的扩展。它指示GNU sed在多行模式下匹配正则表达式
(regexp)。该修饰符 引起‘^’和‘$’分别匹配换行后空字符和空字符后换行(除了正常行为之外)。特殊字符
序列(\‘ 和 \’)一直分别匹配缓冲区的开始和结尾。
另外,在多行模式下,‘.’句点字符不会匹配换行字符。
如果您使用sed,您很可能想要知道这些命令。
# [不允许有地址]
字符“#”开始一个注释,一直到换行为止。
如果您关心可移植性,注意一些不遵循POSIX标准的sed实现可能只支持单行注释,且脚本的注释行第一个字符只能是“#”才行。
警告:如果sed脚本的前两个字符是#n,则强制使用“-n”(禁用自动打印)选项。如果要在脚本的第一行中放置注释,并且该
注释以字母“n”开头,并且不希望出现上述的行为,请您确保使用大写字母“N”,或者在“n”前面至少放置一个空格。
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行的替换(2个n命令跳过2行):
$ seq 6 | sed ‘n; n; s/./x/’
1
2
x
4
5
x
GNU sed提供一个扩展的地址语法:“开始~步长”达到相同的结果:
$ seq 6 | sed ‘0~3s/./x/’
{ cmds} 可以把一组命令放在‘{’和‘}’字符之间,形成命令组。当您希望一组命令由一个地址或地址范围匹配触发时,这特别有用。
例如:完成替换然后打印第二输入行:
$ seq 3 | sed -n ‘2{s/2/X/; p}’
X
虽然这些命令使用频率可能不如前一节的命令多,但使用它们可以构建一些非常小但有用的sed脚本。
y/source-chars/dest-chars/
如果模式空间中的任何字符匹配源字符集(source-chars)的字符,那么逐个转换成目标字符集(dest-chars)的相对应位置
的字符。参见GNU核心工具tr命令,功能相似。
例如:转换“a-j”到“0-9”:
$ echo hello world | sed ‘y/abcdefghij/0123456789/’
74llo worl3
a text 在行后添加文本“text”。这是GNU对标准a命令的扩展,参见下面的内容。例如:在第二行后面追加单词“hello”:
$ seq 3 | sed ‘2a hello’
1
2
Hello
3
忽略a命令后要添加文本的前导空格。在当前行结尾处读取添加的文本。
a\
text 在行后添加文本“text”。例如:在第二行后面添加单词“hello”(-|表示打印输出行起始位置):
$ seq 3 | sed ‘2a\
Hello’
-|1
-|2
-|hello
-|3
a命令对该命令后面的行进行排队(每行最后以‘\’结尾,但是在输出时会删除),以便在当前循环结束时或在读取下一个
输入行时输出。
作为GNU的扩展,这个命令接受两个地址。文本中的转义序列会被处理,因此应该在文本中使用‘\\’来打印一个反斜杠‘\’。
在下面的示例中,命令会在最后不带反斜杠“world” 行后继续:
$ seq 3 | sed ‘2a\
Hello\
World
3s/./X/’
-|1
-|2
-|hello
-|world
-|X
作为GNU扩展,a命令和文本“text”可以分为两个“-e”参数,从而实现更简单的脚本编写:
$ seq 3 | sed -e ‘2a\’ -e hello
1
2
Hello
3
$ sed -e ‘2a\’ -e “$VAR”
i text 在当前行前插入文本“text”。这是GNU对标准i命令的扩展,参见下面的示例。例如:在第二行前面插入单词“hello”:
$ seq 3 | sed ‘2i hello’
1
Hello
2
3
忽略i命令后面文本text的前导空白。在该行结束后读入要插入的文本。
i\
text 立即输出此命令后面的文本行。(译者:即先于当前行输出)。
例如:在第二行前面插入“hello”:
$ seq 3 | sed ‘2i\
hello'
-|1
-|hello
-|2
-|3
作为GNU的扩展,这个命令接受两个地址。文本中的转义序列会被处理,因此应该在文本中使用‘\\’来打印一个反斜杠‘\’。
在下面的示例中,命令会在最后不带反斜杠“world”行后继续:
$ seq 3 | sed ‘2i\
Hello\
World
s/./X/’
-|X
-|hello
-|world
-|X
-|X
作为GNU扩展,i命令和文本“text”可以分为两个“-e”参数,从而实现脚本编写的简化:
$ seq 3 | sed -e ‘2i\’ -e hello
1
Hello
2
3
$ sed -e ‘2i\’ -e “$VAR”
c text 用文本“text”替换一行或多行。这是GNU对标准c命令的扩展,参见下面的细节。
例如:使用单词“hello”替换第2行到第9行:
$ seq 10 | sed ‘2, 9c hello’
1
Hello
10
忽略c命令后面的前导空白。在该行结束后,读入要插入的文本。
c\
text 删除匹配地址的行或者地址范围内所有行,然后输出命令后面的文本内容。例如:用单词“hello”和“world”替换第2行到
第4行(-|表示打印输出行位置):
$ seq 5 | sed ‘2, 4c\
Hello\
World’
-|1
-|hello
-|world
-|5
如果没有提供地址,替换每一行。
因为模式空间被删除,此命令完成后将启动新的循环。在下面的示例中,c命令将启动一个新的循环,并且不会执行对替换的文本
执行替换s命令:
$ seq 3 | sed ‘2c\
hello
s/./X/’
-|X
-|hello
-|X
作为GNU扩展,c命令和文本text可以分为两个“-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语言样式的转义格式打印。如果长行被拆分成多行,则在每个
拆分行最后尾随一个“\”字符来表示拆分;每行的结尾用‘$’标记。
n指定希望换行的长度;长度为0(零)表示从不换行。如果省略,则使用命令行上指定的默认值70。n参数是GNU sed扩展。
r filename
读取文件filename。例如:
$ seq 3 | sed ‘2r/etc/hostname’
1
2
Fencepost.gnu.org
3
在当前循环结束或者读取下一个输入行时,把要读取的文件名为“filename”文件的内容排好队伍,然后插入到输出流中。
注意,如果“filename”不能被读取,就会被处理成好像那个文件是空的,没有任何错误提示。
作为GNU sed扩展,支持把特殊值“/dev/stdin”作为文件名,它从标准输入中读取内容。
作为GNU的扩展,这个命令接受两个地址。那么,该文件会被重新读取,并插入到每一个地址行。
w filename
把模式空间的内容写到文件filename中。作为GNU sed扩展,支持两个特殊文件名的值:“/dev/stderr”,它把结果写到
标准错误中,和“/dev/stdout”,它把结果写到标准输出中。
在读取第一输入行前,文件filename会被创建或者清空。所有引用相同文件名的w命令,包括使用s命令成功替换才触发执行
的w实例,都将在不关闭和重新打开该文件的前提下进行输出。
D 如果模式空间中没有换行符,启动一个正常的新一轮循环,和执行d命令效果一样。否则,先删除模式空间内容至第一个换行符
(含)为止,然后,伴随当前模式空间遗留的内容重启新一轮循环。
N 在模式空间中先追加一个换行符,再追加下一输入行。如果没有更多的输入,sed也不会执行更多的命令,退出。
当使用“-z”选项时,行与行之间加入一个零字节(ASCII “NUL”字符),而不是加入一个换行符。
默认情况下,如果没有“下一输入行”,sed也不会终止。这是一个GNU扩展,可以用选项“--posix”禁用它。
参见[N命令作用在最后一行]。
P 大写P打印模式空间中内容至第一个换行符(含)为止。
h 用模式空间的内容替换保持空间的内容。
H 在保持空间中先追加一个换行符,再追加模式空间中的内容。
g 用保持空间中的内容替换模式空间中的内容。
G 在模式空间中先追加一个换行符,再追加保持空间的内容。
x 交换保持空间和模式空间的内容。
在大多数情况下,这些命令的使用表明您最好使用awk或perl之类的语言进行编程。但偶尔会有人坚持使用sed,并且使用这些命令可以编写非常复杂的脚本。
: label [不允许有地址]。
为分支命令指定标签label的位置。在所有其他方面,没有动作。
b label 无条件跳转到标签label处。如果省略了标签,开始下一轮循环。
t label 只有在上一输入行上匹配、替换成功,或者条件分支被执行,程序才会跳转到标签label处。如果省略了标签,
开始下一轮循环。
这些命令是GNU sed特有的,因此您必须小心地使用它们,并且只有在您确信阻碍可移植性不是坏事时才使用。它们允许您检查GNU sed扩展或执行标准sed不支持而通常是必需的的任务。
e [command]
该命令允许来自于一个shell命令通过管道输入到模式空间。如果没有命令参数,e命令执行在模式空间中找到的命令,然后,
把命令执行结果替换模式空间,并把尾随的换行符删除。
如果指定了参数,e命令把它解释为一个命令,并把执行command命令的输出送到输出流中。该命令可以跨多行运行,但是除了
最后以反斜杠结尾的以外。在这两种情况下,如果要执行的命令包含NUL字符,则结果都是未定义的。
注意,与r命令不同,该命令的输出会立即打印出来;相反,r命令会将输出延迟到当前循环的末尾。
F 打印出当前输入文件的文件名,但是不带结尾的换行符。
Q [exit-code]
此命令只接受一个地址。该命令与q命令相似,但是不会打印模式空间的内容。与q类似,它提供返回一个退出码给调用者的能力。
这个命令可能很有用,因为它完成了这个看起来很平凡、唯一替代方法是使用“-n”选项的功能,但这可能使脚本不必要地复杂化,
或求助于下面的代码片段,这会浪费时间,因为读懂整个文件而没有任何明显的效果:
:eat
$d # 在最后一行安静地退出
N # 安静地读取另外一行
g # 每次覆盖模式空间,保存在内存中
b eat
R filename
在当前循环结束时或者下一输入行读取时,把要读取的一连串filename文件排好队伍,插入到输出流中。注意,如果文件
filename不能读取,或者到达文件末尾,不会追加行,也不会有错误的提示。
和使用r命令一样,支持特殊值“/dev/stdin”成为文件名,它从标准输入读取一行。
T label 只有在上一输入行上替换失败,或者条件分支被执行时,程序才会跳转到标签label处。如果省略了标签,开始下一轮循环。
v version 该命令啥事不做,但是如果GNU sed扩展不支持,会让sed失败,因为仅仅是其他sed版本没有实现它。另外,您可以指定
您的脚本需要的sed版本,例如4.0.5。默认是4.0,因为这是实现该命令的第一个版本。
即使在环境中设置了POSIXLY_CORRECT,该命令也会启用GNU的所有扩展。
W filename
把模式空间中第一个换行符及其前面的内容写到给定文件名为filename文件中。w命令中关于文件处理的所有内容在这里都适用。
z 此命令清空模式空间的内容。它通常与“s/.*//”相同,但在输入流中存在无效的多字节序列时更有效。POSIX要求这种无效的
序列不能与“.”句点匹配,因此,在大多数多字节语言环境(包括UTF-8语言环境)中,没有可移植的方法来清除脚本中间的
sed缓冲区。