以下内容首发自公众号“小汪Waud”。
sed是stream editor的缩写,译为"流编辑器",一般用来对文本数据进行增删改查即新增、删除、替换、查找。
与其他命令不同的是sed命令在处理数据之前,需要预先提供一组规则,sed会按照此规则来处理数据。处理时,sed 会把要处理的行存储在缓冲区中,接着用 sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。这个缓冲区被称为“模式空间”(pattern space)。
用法: sed [参数] 操作 [文件]
常见参数
- -n 只显示经过sed处理的行
- -e 执行多个命令
- -f 执行含有sed命令的文件
- -r 支持扩展正则表达式(默认为基础正则表达式)
- -i 直接修改读取的文件内容,不输出
命令
- -a:新增,在当前行的后一行新增a后面的字符串
- -c:替换
- -d:删除
- -i:插入,在当前行的前一行新增i后面的字符串
- -p:打印,将选择的数据打印出来,通常与-n同时使用
- -s:替换,常搭配正则表达式;如2,5s/are/is/g
看似简单的用法其实复杂的很!参数我们已经提到了,那操作是什么呢?
操作:范围+命令
范围设定,可以采用两种不同的方式来表达:
- 指定行数:比如'3,5'’'表示第三至第五行;而'3,$'示第三行至文件最后一行。
- 模式匹配:比如/[Aa]/表示匹配行首不是以A或a开头的行。
操作必须用单/双引号扩住,[]的内容可以省略。
接下来给大家举几个例子,我在test.txt文件中写入了这么3句话

a新增
在第二行后新增有what的一行

- 在第二行后新增多行what:sed "2a what\what\what" test.txt
c替换
将第二和第三行替换成what

d删除
将第二和第三行删除

- 删除第二至最后一行 sed "2,$d" test.txt
i插入
在第二行前新增有what的一行

p打印
只打印第一和第二行

s替换
将第一至第三行中的is替换成are

现在看起来挺简单的对吧?那不如看几个进阶练习题
## 进阶1
# 查看/etc/passwd的前5行
(base) zwang@ken_bioinfo:~$ head -n 5 /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
# 使用sed命令将冒号及后面的内容删掉
(base) zwang@ken_bioinfo:~$ head -n 5 /etc/passwd|sed 's/:.*$//'
root
daemon
bin
sys
sync
## 进阶2
# 查看test.txt文件
(base) zwang@ken_bioinfo:~$ cat test.txt
This is a test file
Linux is not hard to learn
So,don't worry!
# 将带有file的行打印出来
(base) zwang@ken_bioinfo:~$ cat test.txt | sed -n '/file/p'
This is a test file
参考资料
- C语言中文网
http://c.biancheng.net/linux/sed.html
- 鸟哥的Linux私房菜
网友评论