Linux System Environment
[root@commond ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core) #==》系统版本
[root@commond ~]# uname -r
3.10.0-862.el7.x86_64 #==》内核版本
[root@commond ~]# uname -m
x86_64 #==》系统架构
[root@commond ~]# echo $LANG
en_US.UTF-8 #==》系统字符集
[root@commond ~]# sed --version
sed (GNU sed) 4.2.2 #==》sed版本
sed功能
sed是一个流编辑器,操作、过滤和转换文件内空的强大工具,按行处理文件内容。处理时,把当前处理的行存储在内存buffer临时缓冲区,称为“模式空间”,sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。处理完一行再处理下一行,不断地的重复,直到文件结尾。常用功能有增删改查,过滤,取行。
sed格式
sed [option] [sed-commands] [input-file]
sed 参数
1、-e #==》多项编辑
2、-i #==》修改信息
3、-r #==》使用扩展正则表达式
4、-n #==》取消默认输出
5、-p #==》打印匹配信息
6、-d #==》删除匹配信息
7、-a #==》追加插入信息
8、-i #==》在指定行之前插入一行
9、-c #==》替换指定行匹配的字符
10、-s #==》替换每行匹配的第一个单词
11、-g #==》全局替换
12、-G #==》在指定行之后追加一行空行
sed命令处理文本内容流程图

测试文本内容:
[root@commond ~]# cat person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
一、sed增加操作
选项 功能描述
a 追加内容到指定行之后
i 插入内容到指定行之前
1、追加内容到指定行之后
[root@commond ~]# sed '2a 106,dandan CSO' person.txt
101,oldboy,CEO
102,zhangyao,CTO
106,dandan CSO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
2、插入内容到指定的行之前
[root@commond ~]# sed '2i 106,dandan,CSO' person.txt
101,oldboy,CEO
106,dandan,CSO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
3、追加多行内容到指定行之前
[root@commond ~]# sed '2a 106,dandan,CSO\n107,bingbing,CCO' person.txt
101,oldboy,CEO
102,zhangyao,CTO
106,dandan,CSO
107,bingbing,CCO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
二、sed删除操作
选项 功能描述
d 删除指定的行
10[sed-commands] 对第10行操作
10,20[sed-commands] 对10到20行操作,包括第10,20行
10[sed-commands];15[sed-commands] 对第10行和第15行操作
1~2[sed-commands] 对1,3,5,7等奇数行操作
10,$ [sed-commands] 对10到最后一行($代表最后一行)操作,包括第10行
/oldboy/[sed-commands] 对匹配oldboy的行操作
/oldboy/,/Alex/[sed-commands] 对匹配oldboy的行匹配Alex的行操作
/oldboy/,$[sed-commands] 对匹配oldboy的行到最后一行操作
/oldboy/,10[sed-commands] 对匹配oldboy的行到第10行操作,注意,如果前10行设有匹配到oldboy,sed软件会显示10行以后的匹配oldboy的行
1,/Alex/[sed-commands] 对第1行到匹配Alex的行操作
/oldboy/,+2[sed-commands] 对匹配oldboy的行到其后的2行操作
1、删除第2行内容
[root@commond ~]# sed '2d' person.txt
101,oldboy,CEO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
2、删除第2行到第4行的内容
[root@commond ~]# sed '2,4d' person.txt
101,oldboy,CEO
105,feixue,CIO
3、删除第2行和第4行
[root@commond ~]# sed '2d;4d' person.txt
101,oldboy,CEO
103,Alex,COO
105,feixue,CIO
4、删除从第2行之后的两行(包括第2行)
[root@commond ~]# sed '2,+2d' person.txt
101,oldboy,CEO
105,feixue,CIO
5、删除匹配的多行
[root@commond ~]# sed -r '/oldboy|yy/d' person.txt
102,zhangyao,CTO
103,Alex,COO
105,feixue,CIO
6、删除匹配Alex字符串的Alex行以后的内容(包括Alex行)
[root@commond ~]# sed '/Alex/,$d' person.txt
101,oldboy,CEO
102,zhangyao,CTO
三、sed修改操作
选项 功能描述
c 用新行取代旧行
s 单独使用,将每一行中第一处匹配的字符串进行替换
g 第一行进行全部替换,配合s一起使用
-i 修改文本内容
-r sed扩展正则表达式用法,可以忽略特殊的转义字符
\(\)和\1 分组替换,最多使用9个
1、替换第2行内容
[root@commond ~]# sed '2c 160,dandan,CSO' person.txt
101,oldboy,CEO
160,dandan,CSO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
2、将每一行中第一处匹配的字符串进行替换
[root@commond ~]# sed 's#Alex#oldgirl#' person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,oldgirl,COO
104,yy,CFO
105,feixue,CIO
3、将所有行匹配的字符串进行替换
[root@commond ~]# sed 's#Alex#oldgirl#g' person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,oldgirl,COO
104,yy,CFO
105,feixue,CIO
4、多项匹配进行替换
[root@commond ~]# sed 's#Alex#one#g;s#oldboy#two#g' person.txt
101,two,CEO
102,zhangyao,CTO
103,one,COO
104,yy,CFO
105,feixue,CIO
5、截止取oldboy字符串,\1代表前面(.*)
[root@commond ~]# echo 'i am oldboy teacher.' | sed -r 's#^.*am (.*) tea.*$#\1#g'
oldboy
6、前后字符串交换位置
[root@commond ~]# echo 'I love you' | sed -r 's#(.*) (.*) (.*)#\3 \2 \1#g'
you love I
7、位置符\1 \2 \3
[root@commond ~]# echo 'I love you' | sed -r 's#(.*) (.*) (.*)#\1 \3#g'
I you
8、批量修改文件名,字符&代表前面的内容
[root@commond ~]# touch stu_333_{1..6}_finished.jpg
[root@commond ~]# ls -l *.jpg
-rw-r--r-- 1 root root 0 Sep 3 13:44 stu_333_1_finished.jpg
-rw-r--r-- 1 root root 0 Sep 3 13:44 stu_333_2_finished.jpg
-rw-r--r-- 1 root root 0 Sep 3 13:44 stu_333_3_finished.jpg
-rw-r--r-- 1 root root 0 Sep 3 13:44 stu_333_4_finished.jpg
-rw-r--r-- 1 root root 0 Sep 3 13:44 stu_333_5_finished.jpg
-rw-r--r-- 1 root root 0 Sep 3 13:44 stu_333_6_finished.jpg
[root@commond ~]# ls *.jpg | sed -r 's#(.*).jpg#mv & \1.txt#g' | bash
[root@commond ~]# ls -l *.txt
-rw-r--r-- 1 root root 71 Sep 3 10:20 person.txt
-rw-r--r-- 1 root root 0 Sep 3 13:44 stu_333_1_finished.txt
-rw-r--r-- 1 root root 0 Sep 3 13:44 stu_333_2_finished.txt
-rw-r--r-- 1 root root 0 Sep 3 13:44 stu_333_3_finished.txt
-rw-r--r-- 1 root root 0 Sep 3 13:44 stu_333_4_finished.txt
-rw-r--r-- 1 root root 0 Sep 3 13:44 stu_333_5_finished.txt
-rw-r--r-- 1 root root 0 Sep 3 13:44 stu_333_6_finished.txt
四、sed查找操作
选项 功能描述
p 输出指定内容,但默认会输出2次匹配的结果并且全部内容输出,因此使用n取消默认输出
-n 只输出匹配的行,配合p使用
; 分号把多条命令进行分隔处理
1、指定输出行,默认会输出2次匹配的结果并且全部内容输出
[root@commond ~]# sed '2p' person.txt
101,oldboy,CEO
102,zhangyao,CTO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
2、只输入匹配的行,配合p使用
[root@commond ~]# sed -n '2p' person.txt
102,zhangyao,CTO
3、打印匹配的第2行和第3行
[root@commond ~]# sed -n '2,3p' person.txt
102,zhangyao,CTO
103,Alex,COO
4、打印匹配的第2行和第4行
[root@commond ~]# sed -nr '2p;4p' person.txt
102,zhangyao,CTO
104,yy,CFO
五、sed其它操作
选项 功能描述
-f 将命令写在文本内,执行文本就可以执行里面的命令
\\ 两个转义字符代表打印空行
1、将修改内容以文本形式进行修改
[root@commond ~]# echo 's#oldboy#OLDGIRL#g' > test.txt
[root@commond ~]# cat test.txt
s#oldboy#OLDGIRL#g
[root@commond ~]# sed -f test.txt person.txt
101,OLDGIRL,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
2、两个转义字符等同于空行
[root@commond ~]# sed -n '2,3p' person.txt | sed '2i \\'
102,zhangyao,CTO
103,Alex,COO
网友评论