linux sed命令

互联网 2022/5/22 7:06:58

什么是sed sed 是 stream editor 的缩写,中文称之为“流编辑器”。 sed 命令是一个面向行处理的工具,它以“行”为处理单位,针对每一行进行处理,处理后的结果会输出到标准输出(STDOUT)。你会发现 sed 命令是很懂礼貌的一个命令,它不会对读取的文件做任何贸然的修改…

 

什么是sed

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

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

sed的结构

sed 的命令格式:

sed command file
  • command 部分:针对每行的内容所要进行的处理(这部分很重要很重要)。
  • file 部分:要处理的文件,如果忽略 file 参数,则 sed 会把标准输入作为处理对象。

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 配合使用,其含义就是,输出那些匹配的行。  

 

随时随地学软件编程-关注百度小程序和微信小程序
关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。
本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。
[linux sed命令]http://www.zyiz.net/tech/detail-324244.html

赞(0)
关注微信小程序
程序员编程王-随时随地学编程

扫描二维码或查找【程序员编程王】

可以随时随地学编程啦!

技术文章导航 更多>