sed的用法

sed 是一种非交互式的流编辑器,可动态编辑文件。所谓非交互式是说,sed 和传统的文 本编辑器不同,并非和使用者直接互动,sed 处理的对象是文件的数据流(称为 stream/流)。 sed 的工作模式是,比对每一数据行,若符合样式,就执行指定的操作。

本节介绍的 sed 是指 GNU 版的 sed。

执行 sed --version 可查看版本信息。

sed 的语法如下:

sed '样式命令' 文件 

它的意思是说:如果文件中某一行符合“样式”,就执行指定的 sed 命令,如删除(d) 或取代(s)。

这里的“样式”使用一对//含括,表示寻找之意;也可以指定数据行的范围,例如:1,6 表示作用范围是由第 1 行到第 6 行;/AAA/,/DDD/表示作用范围是从含有 AAA 的数据行, 到含有 DDD 的数据行。

请特别注意:sed 并不会更改文件内容。sed 的工作方式是读取文件内容,经流编辑之后, 把结果显示到标准输出。因此,如果想要存储 sed 的处理结果,得自行运用转向输出将结果 存成其他文件。

以下介绍 sed 的各种用法:

  • sed 的用法 1:删除某一段范围的数据行。
sed '1,4d' dataf1  

把第 1 到第 4 行数据删除,剩下的显示出来。d 是 sed 的删除命令。

  • sed 的用法 2:把含有“样式”的数据行删除。
 sed '/La/d' dataf3  

把含有 La 的行删除,剩下的显示出来。其中,/ / 代表搜索之意。

sed '/[0-9]\{3\}/d' dataf3  

把含有“3 位数”的行删除,剩下的显示出来。 在样式[0-9]\{3\}中,\{3\} 表/ /要寻找的是 3 个数字组成的字符串。

 sed '/^$/d' dataf5  

删除 dataf5 的空白行。^ 表开头,$ 表尾部,这两者之间没有任何字符,代表该行是一 空白行。

  • sed 的用法 3:把不含有“样式”的数据行删除。
sed '/La/!d' dataf3  

把不含有 La 的行删除,剩下的显示出来。 这里的!是否定的意思,表示不符合样式者。

  • sed 的用法 4:把含有“样式”的数据行显示出来。
sed '/La/p' dataf3  

把含有 La 的行显示出来。其中,p 是 sed 的命令,它会把目前的数据显示出来, 但因为 sed 默认也会显示不符合的数据行,所以,应改用以下指令:

sed -n '/La/p' dataf3 

选项-n 会抑制 sed 显示出其他资料行的默认操作,只显示符合样式的数据行。

  • sed 的用法 5:取代。
 sed -n 's/La/Oo/p' dataf3  

这里的 s 是取代的意思,第一对//中含括的字符串(La)是搜索的目标,第二对//含 括的是置换的字符串(Oo)。它会把数据行中的字符串 La 换成 Oo。 请注意:上面这个指令,只会更换第一个出现的 La 而已,如要全部置换,应再加上全 局的命令 g,如下所示:

sed -n 's/La/Oo/gp' dataf3  

这样就会把所有找到的 La 全换成 Oo 了。 取代的用法,还有以下几个:

 sed -n 's/La//p' dataf3  

把每一行第一个出现的 La 删除(把 La 置换成空字符串,就是删除)。

sed 's/^...//' dataf3 

把每一行开头的 3 个字符删除。

sed 's/...$//' dataf3  

把每一行末尾 3 个字符删除。

  • sed 的用法 6:取用符合样式的字符串。
sed -n 's/\(La\)/\1Oo/p' dataf3  

把找到的 La 存起来,用\1 取回来再使用。

这个指令作用的结果:若数据行含有 La 字符串,则第一个出现的 La 会置换成 LaOo, 然后再显示这些含有 La 的数据行。

  • sed 的用法 7:找到符合样式的数据行后,再进行取代的操作。
 sed -n '/AAA/s/234/567/p' dataf3  

找到含有 AAA 的那一行之后,将 234 换成 567。

sed -n '/AAA/,/DDD/s/B/567/p' dataf3  

将含有 AAA 到含有 DDD 的那几行,皆将其中的 B 换成 567。

sed -n '2,4s/B/567/p' dataf3  

由第 2 行到第 4 行,皆将其中的 B 换成 567。 由以上的说明可知:sed 动态编辑的威力是相当强大的,它补足了 Bash 在修改文件方面 能力的不足。

发表评论

后才能评论