流编辑器sed

sed与grep一样,都起源于老式的ed编辑器,因其是一个流编辑器(stream editor)而得名。与vi等编辑器不同,sed是一种非交互式编辑器(即用户不必参与编辑过程),它使用预先设定好的编辑指令对输入的文本进行编辑,完成之后再输出编辑结果。

sed工作时,首先读取文本中的第1行,将其放入一个被称为模式空间的临时缓冲区内。然后再读取第一条编辑指令,使用指令中定义的模式和行号查找、编辑文本。(这些操作都是针对读入到模式空间里的文本进行的操作,原文本的内容不受影响)完成编辑后,将结果输出并读取下一行,重复这个过程直到文本结束。除了模式空间之外,sed还使用了一个被称为保留空间的临时缓冲区,保留空间通常用于暂存编辑内容。

sed通常用来对多个文件或命令输出进行重复处理,以达到简化操作的目的。它是一个非常重要的文本过滤工具。

一、sed基本格式 命令格式:

sed [option] command input-file

sed [option] –f script-file input-file

上面的命令格式中,展示了sed的两种使用方法。第一种调用方法中,将编辑指令直接放在选项后面,这是最为常见的一种。当执行一些较为复杂的编辑操作时,可能使用的编辑命令会很长,这时为了便于阅读,通常将编辑指令放入一个脚步文件中,通过第2种方法来调用sed编辑文本。

常用选项:

选项用于指定编辑行为、打印设置等,常用的选项如下:

n:不输出所有行,默认情况是输出所有行。

e:允许在该选项后面加一条新的编辑指令。当有多条编辑指令时,应该使用该选项逐一添加,如果编辑指令只有一条,可以不使用该选项。

f:用于指定装有编辑指令的脚本文件。

h:输出sed的帮助信息。

常用的定位方式:

使用sed编辑文本时,应该向其指出要编辑的位置信息,通常使用一个行号或指定一个行号范围,也可以使用正则表达式对要编辑的文本进行模式匹配。常见的操作如下。

n:表示行号为n的行。

m,n:表示一个行号的范围,从第m行到第n行。

m,,n!:排除第m行到第n行。

/pattern/:表示匹配pattern的所有行。

/pattern1/pattern2/:表示匹配pattern1和pattern2的所有行(需要使用选项e将两个模式隔开)。

/pattern/,~n:从匹配pattern的行开始,向后的n行(即包括匹配行在内,一共n行)。

/pattern/,+n:从匹配pattern的行开始,加上其后面的n行(即包括匹配行在内,一共n+1行)。

n,/pattern/:表示从第n行开始到匹配pattern之内的所有行。

常用的编辑指令:

使用sed编辑文本时,必须要使用对文本进行操作的指令(称为编辑指令),使用编辑指令可以对文本执行修改、删除和替换等操作。常用的编辑指令及说明如下。

p:将指定的行输出到标准输出。

P:将模式空间中第一个换行符“\n”之前的文本输出到标准输出(选项为大写P)。

=:输出匹配模式所在的行号。

d:移除模式空间中的行并读取下一行。

D:删除模式空间中最后一个换行符之前的文本。如果模式空间为空,则将下一行文本读取到模式空间中。

a\text:在指定的行后面加入新的文本信息text。

i\text:在指定行前面加入新的文本信息text。

c\text:使用新文本信息text替换定位行。

r file:从文件file中读取文本。

w file:将结果写入file文件中。

s/pattern1/pattern2/flag:将与模式pattern1匹配的文本用pattern2替换。默认情况下,只替换第一次匹配到的内容。指令之后的/分隔符可以使用任意字符替代。

n:如果没有禁止默认输出所有行功能(即没有使用选项n),则将模式空间的内容输出到标准输出。如果禁止默认输出功能,就读取下一行文本并替换模式空间中的文本。

N:在当前模式空间中的文本末尾加上换行符\n,并读取下一行文本追加到换行符之后。

!command:对没有被定位的行使用!之后的command编辑指令。

y/pattern1/pattern2/:将与模式pattern1匹配的文本用pattern替换,pattern1和pattern2的字符长度应该相等。

l:将模式空间的文本和控制字符以肉眼可见的方式输出到标准输出。

{sub_command}:执行大括号内的子命令或子命令组。

g:清除模式空间并将保留空间的文本放进模式空间(即模式空间<保留空间)

G:将保留空间的文本追加到模式空间的文本之后(即模式空间<<保留空间)

h:清除保留空间并将模式空间的文本放入保留空间(即模式空间>保留空间)

H:将模式空间的文本追加到保留空间的文本之后(即模式空间>>保留空间)

x:保留空间的文本和模式空间的文件进行互换。

Q:退出指令。使用q指令可以让sed立即退出,不再执行后面的操作。

在上面的编辑指令中,替换匹配模式指令s的flag选项通常向sed指示如何替换或替换成功后要进行的操作。常见的flag选项如下:

g:将所有匹配到的内容全部替换。

n:仅对行内第n次匹配到的内容进行替换。

p:如果进行了替换,就将模式空间的文本输出到标准输出。

w file:如果进行了替换,就将模式空间的文本写入文件file中。

一个编辑指令只能对指定位置进行一次编辑操作,如果要对指定位置执行多次编辑操作,可以使用大括号{}将多条编辑指令放入其中。而对多个位置进行多次编辑可以使用e选项添加多条编辑指令,也可以使用管道并配合多个sed命令。

常用的分支语句:

:label :标记点。标记一个位置以便于跳转语句跳转到指定位置。可以使用任何8个或少于8个字符的字符串来做标记点。

t label:测试指令,如果上一条替换指令成功执行,则转移到标记点label处继续执行。如果没有label,则转移到末尾。

b label:无条件转移到标记点label处继续执行。如果没有label,则转移到末尾。

#:一般用于脚本的注释。将#号后面的内容视为注释,sed将忽略后面的内容,直接执行下一行。如果出现在脚本的第1行,且后面是n(即#n),sed将不禁止默认地输出所有行。

使用了分支语句的编辑指令通常都很长,一般将这些指令放在脚本文件中,然后使用f选项调用sed。

二、显示和删除行

sed命令执行结束后,通常将结果输出到屏幕上,如果需要保存sed命令的输出结果,可以使用输出重定向的方法。

说明:通常将编辑指令放入单引号中,以便于阅读及屏蔽某些特殊字符。

1、显示行

显示行需要使用sed的编辑命令p,指定显示内容可以使用行号、行号范围、正则表达式等。

(1)使用数字3指定输出文本的第3行:

#使用数字3指定输出的行号#由于sed默认输出所有行,因此使用选项n屏蔽掉默认的输出[root@localhost zhu]# sed -n students 有希望在的地方,痛苦也成欢乐

流编辑器sed

相关文章:

你感兴趣的文章:

标签云: