首页 » 信息技术 »

sed命令

2020年9月27日 / 13次阅读
Linux常用命令

sed命令,Stream EDitor,流编辑器。所谓流,就是一行一行的处理文件内容,所以占用内存小。至于速度,要看你的需求是什么了。

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

在Linux的世界中,有着一个文本三剑客的称呼,它们分别代表grep(文本过滤),sed(流编辑器),awk(gawk)(报告生成器)。

后面case study吧。

$ cat ts.txt
abcde
12345
hjklm
67890
$ sed 'p' ts.txt
abcde
abcde
12345
12345
hjklm
hjklm
67890
67890
$ sed -n 'p' ts.txt
abcde
12345
hjklm
67890

用ts.txt文件来举例。sed中 p 表示 print,sed 'p' ts.txt,其实是将文件的每一行都打印了2次,这很好理解,sed取到这一行的时候,p一次,经过处理后,在p一次。所以,-n 参数就来了,取行的那一次就不要p了。-n 与 --quiet 或 --silent等效。

 $ sed --silent '/3/p' ts.txt
12345
$ sed --silent '/[3|6]/p' ts.txt
12345
67890

把含有3或6的行打印出来。第一个 / 后面跟的是regular expression。

$ sed '/[3|6]/d' ts.txt
abcde
hjklm

把含有3或6的删除,d 表示 delete,注意这次没有 -n ,不抑制输出,而是在输出的时候,将符合regular expression的行delete。也不再是真的delete,只是不输出。

$ sed -n '1,3p' ts.txt
abcde
12345
hjklm
$ sed -n '2p' ts.txt
12345

显示指定的行。

$ sed '/2/s/2/B/g' ts.txt
abcde
1B345
hjklm
67890

找到含2的行,将2替换成B,全部替换。这个 s 参数的风格,与vim中的替换命令一样。

$ echo '2222222' >> ts.txt
$ cat ts.txt
abcde
12345
hjklm
67890
2222222
$ sed '/2/s/2/B/' ts.txt
abcde
1B345
hjklm
67890
B222222
pi@rpi01:~/test $ sed '/2/s/2/B/g' ts.txt
abcde
1B345
hjklm
67890
BBBBBBB

s参数中最后的/g的作用如上。

$ sed '/2/s/2/&B/g' ts.txt
abcde
12B345
hjklm
67890
2B2B2B2B2B2B2B
$ sed '/^2/s/2/&B/' ts.txt
abcde
12345
hjklm
67890
2B222222

这个例子说明 & 符号的作用,就是在匹配到的字符串后面追加。

$ sed -n -e '/^2/s/2/&B/' -e '/2B/p' ts.txt
2B222222
$ sed -n -e '1,2p' -e '/2/p' ts.txt
abcde
12345
12345
2222222

这个例子说明 -e 参数的作用,它的出现,可以让命令行中,出现多个sed命令参数。如上例,第一个-e做s,第二个-e做p。

$ sed '/2/a\KKK' ts.txt
abcde
12345
KKK
hjklm
67890
2222222
KKK

参数 a ,在符合条件行 后面 追加新的行!

$ sed '/2/i\KKK\n\n' ts.txt
abcde
KKK


12345
hjklm
67890
KKK


2222222

参数 i ,在符合条件行 前面 追加新的行!

参数 -f ,可以实现从一个文件中调入sed命令的参数,考虑到sed命令的参数很长,而且可能需要反复使用的情况。

$ echo 'a,b,c,d,e'|sed 'y/abcde/12345/'
1,2,3,4,5

$ cat test.txt
a,b,c
a,b,c
$ sed 'y/abcde/12345/' test.txt
1,2,3
1,2,3

不同于 s 替换,y 替换是按字符来的,比如上例,将a-->1,b-->2.....

s和y的相同之处,都是可以指定替换的范围,从哪行到几行,

$ sed '1,2y/[a-z]/[A-Z]/' copy.txt
$ sed '1,2y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' copy.txt

 

$ cat ts.txt
abcde
12345
ererere
678976
$ sed -i '/2/d' ts.txt
$ cat ts.txt
abcde
ererere
678976

参数 -i,inplace,直接原地修改文件!

本文链接:https://www.maixj.net/ict/sed-23972

留言区


前一篇:
后一篇:
-->只要几分钟回答问卷,就能轻松赚现金!

栏目精选

云上小悟,麦新杰的独立博客

Ctrl+D 收藏本页

栏目


©Copyright 麦新杰 Since 2014 云上小悟独立博客版权所有 备案号:苏ICP备14045477号-1。云上小悟网站部分内容来源于网络,转载目的是为了整合信息,收藏学习,服务大家,有些转载内容也难以判断是否有侵权问题,如果侵犯了您的权益,请及时联系站长,我会立即删除。

go to top