系统相关
首页 > 系统相关> > linux sed命令

linux sed命令

作者:互联网

 

什么是sed

sed 是 stream editor 的缩写,中文称之为“流编辑器”。

sed 命令是一个面向行处理的工具,它以“行”为处理单位,针对每一行进行处理,处理后的结果会输出到标准输出(STDOUT)。你会发现 sed 命令是很懂礼貌的一个命令,它不会对读取的文件做任何贸然的修改,而是将内容都输出到标准输出中。

sed的结构

sed 的命令格式:

sed command file

sed 的工作原理是什么

刚才我们说了,sed 命令是面向“行”进行处理的,每一次处理一行内容。处理时,sed 会把要处理的行存储在缓冲区中,接着用 sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。这个缓冲区被称为“模式空间”(pattern space)。

如前面所说,在这个处理过程中,sed 命令并不会对文件本身进行任何更改。

看一个最最简单的 sed 命令的例子

 

现看原文件
# cat test.txt
test01
test02
test03

用sed命令,来删除文件中带符号“2”的行
# sed '/2/d' test.txt
test01
test03

sed操作是在自己的模式空间中执行的,所以是不会改动test.txt原原文件
# cat test.txt
test01
test02
test03
#

  这个命令的 command 部分是/2/d,而且它是用单引号括起来的。

  用到 sed,别忘了用单引号将 command 部分括起来。

  /2/d中的 d 表示删除,意思是说,只要某行内容中含有字符 2,就删掉这一行。(sed 所谓的删除都是在模式空间中执行的,不会真正改动 roc.txt 原文件。)

 

用 sed 命令实现 cut 命令的效果

假如我们想实现类似于 cut-d:-f 1/etc/passwd 的效果,也就是以冒号为间隔符提取第 1 个域,用 sed 命令应该怎么操作呢?

# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
# head -n 5 /etc/passwd | sed 's/:.*$//'
root
bin
daemon
adm
lp

  command 部分指定成了's/:.*$//',表示我们要把每一行的第一个冒号到结尾的部分都清空,这样留下的便是第一个冒号前的内容啦。

 这里 command用到的是s命令s命令的语法格式如下:

s/regexp/replacement/[flags]
regexp是要查找匹配的正则 replacement是替换内容 [flags]是可选的,用来添加一些额外标记参数

sed 都有哪些好用的选项

说到 sed 命令的选项,就不得不提-n选项,想把这个选项介绍清楚,还是要费一些脑子和笔墨的。

前面提到,sed 会将模式空间里的行经过处理后输出到标准输出,这是默认的处理方式。也就是说,除非你使用“d”来删除此行,否则经过“模式空间”处理的行都是会被输出到标准输出(屏幕)上的。我们一起来看下面的例子:

#还是先来看看原文件的内容
[roc@roclinux ~]$ cat roc.txt
1
2
3
4
5
 
#仔细看, 输出中出现了两个“4”
[roc@roclinux ~]$ sed ‘/4/p’ roc.txt
1
2
3
4
4
5

  

看,所有的原始文件内容都被输出来了,而且含有字符4的行被输出了两遍。


但这就是 sed 命令的工作原理,它会不问青红皂白地把经过处理的行先输出出来,然后再执行后面的动作。(在这里我们设定了 p,表示打印此行。)这明显不符合我们的初衷,我们只是想让 sed 命令找到含有 4 的行再输出。

这时候,不妨加上-n选项试一试,你会发现,结果变得如你所愿了。

[roc@roclinux ~]$ sed -n '/4/p' roc.txt
4


-n选项会很严肃地警告 sed 命令:除非是明确表明要输出的行,否则不要给我胡乱输出。-n选项经常和 p 配合使用,其含义就是,输出那些匹配的行。  

 

标签:输出,处理,roc,命令,sed,linux,txt
来源: https://www.cnblogs.com/lei2017/p/16292915.html