GNU sed 4.5 版参考文档全文翻译 各命令和随带20个示例详细解析(二)

12 篇文章 2 订阅

GNU sed 一个流编辑器(二)

—— 版本 4.5,2018年3月30日
作者:Ken Pizzini, Paolo Bonzini
译者:浙江省杭州市 Samuel        

标签: Linux sed 4.5版本 参考文档 帮助文档 全文翻译 随带20个示例 详细解析

版权声明:本文为博主原创译文,未经博主允许不得转载。https://blog.csdn.net/qq_39785418/article/details/89765003


3、 sed脚本

3.1 sed脚本概括

  程序由一个或多个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节[多命令语法]。

3.2 sed命令摘要

  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)的位置。

3.3 替换命令

  替换命令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)。该修饰符			引起‘^’和‘$’分别匹配换行后空字符和空字符后换行(除了正常行为之外)。特殊字符
			序列(\‘ 和 \’)一直分别匹配缓冲区的开始和结尾。
			

  另外,在多行模式下,‘.’句点字符不会匹配换行字符。

3.4 常用命令

  如果您使用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
			
3.5使用频率较低的命令

  虽然这些命令使用频率可能不如前一节的命令多,但使用它们可以构建一些非常小但有用的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			交换保持空间和模式空间的内容。	

3.6 sed大师的命令

  在大多数情况下,这些命令的使用表明您最好使用awk或perl之类的语言进行编程。但偶尔会有人坚持使用sed,并且使用这些命令可以编写非常复杂的脚本。


: label	[不允许有地址]。
			为分支命令指定标签label的位置。在所有其他方面,没有动作。
			
b label		无条件跳转到标签label处。如果省略了标签,开始下一轮循环。

t label		只有在上一输入行上匹配、替换成功,或者条件分支被执行,程序才会跳转到标签label处。如果省略了标签,
				开始下一轮循环。

3.7 GNU sed特有的命令

  这些命令是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缓冲区。
			

GNU sed 4.5 版参考文档全文翻译 各命令和随带20个示例详细解析(三)

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值