介绍
sed 是 stream Editor(字符流编辑器) 的缩写, 简称流编辑器. sed 是一种流编辑器, 它是文本处理中非常中的工具, 能够完美的配合正则表达式使用, 功能不同凡响. 处理时, 把当前处理的行存储在临时缓冲区中, 称为 "模式空间"(pattern space), 接着用 sed 命令处理缓冲区中的内容, 处理完成后, 把缓冲区的内容送往屏幕. 接着处理下一行, 这样不断重复, 直到文件末尾. 文件内容并没有 改变, 除非你使用重定向存储输出. Sed 主要用来自动编辑一个或多个文件; 简化对文件的反复操作; 编写转换程序等.
软件功能与版本
sed 命令是操作, 过滤和转换文本内容的强大工具, 常用功能有增删改查, 其中查询的功能中最常用的 2 大功能是过滤 (过滤指字符串), 取行 (取出指定行)
查看一下 sed 版本
- [root@oldboy34 ~]# cat /etc/redhat-release
- CentOS release 6.8 (Final)
- [root@oldboy34 ~]# sed --version
GNU sed version 4.2.1
语法格式
sed [options] [sed-commands] [input-file]
sed [选项] [sed 命令] [输入文件]
选项说明
sed-commands [sed 命令 ] | 解释说明 |
a | 追加,在指定行后添加一行或者多行文本 |
c | 取代指定的行 |
d | 删除指定的行 |
D | 删除模式空间的部分内容,直到遇到换行符 < span style="font-family: "Times New Roman"" ztid="134" ow="11" oh="15">\n 结束操作,与多行模式相关 |
i | 插入,在指定行前添加一行或多行文本 |
h | 把模式空间的内容复制到保持空间 |
H | 把模式空间的内容追加到保持空间 |
g | 把保持空间的内容复制到模式空间 |
G | 把保持空间的内容追加到模式空间 |
x | 交换模式空间和保持空间内容 |
l | 打印不可见的字符 |
n | 清空模式空间的内容并读入下一行 |
N | 不清空模式空间,并读取下一行数据并追加到模式空间 |
p | 打印模式空间的内容,通常 < span style="font-family: "Times New Roman"" ztid="186" ow="7" oh="15">p 会与选项 -n 一起使用 |
P(大写) | 打印模式空间的内容,直到遇到换行符 < span style="font-family: "Times New Roman"" ztid="196" ow="11" oh="15">\n 结束操作 |
q | 退出 < span style="font-family: "Times New Roman"" ztid="203" ow="22" oh="15">sed. |
r | 从指定文件读取数据 |
s | 取代,s#old#new#g==> 这里 g 是 s 命令的替换标志,注意和 g 命令区分 |
w | 另存,把模式空间内容保存到文件中 |
y | 根据对应位置转换字符 |
:label | 定义一个标签 |
b label | 执行该标签后面的命令 |
t | 如果前面的命令执行成功,那么就跳转到 < span style="font-family: "Times New Roman"" ztid="248" ow="4" oh="15">t 指定的标签处,继续往下执行后续命令。否则,仍然继续正常的执行流程。 |
特殊符号 | 解释说明 |
! | 对指定行以外的所有行应用命令 |
= | 打印当前行行号 |
~ | “First~Step”表示出 < span style="font-family: "Times New Roman"" ztid="273" ow="25" oh="15">First 行开始,以步长 Step 递增 |
& | 代表被替换的内容 |
; | 实现一行命令语句可以执行多条 < span style="font-family: "Times New Roman"" ztid="287" ow="19" oh="15">sed 命令 |
{} | 对单个地址或地址范围执行批量操作 |
+ | 地址范围中用到的符号,做加法运算 |
使用范例
统一实验文本
- cat>person.txt<<EOF
- 101,oldboy,CEO
- 102,zhangyao,CTO
- 103,Alex,COO
- 104,yy,CFO
- 105,feixue,CIO
- EOF
- [root@oldboy34 tmp]# cat person.txt
- 101,oldboy,CEO
- 102,zhangyao,CTO
- 103,Alex,COO
- 104,yy,CFO
- 105,feixue,CIO
常用功能 -- 增删改查
增
单行增加
a 追加
- [root@oldboy34 tmp]# sed '2a aaaaaaaaaaaa' /tmp/person.txt
- 101,oldboy,CEO
- 102,zhangyao,CTO
- aaaaaaaaaaaa
- 103,Alex,COO
- 104,yy,CFO
- 105,feixue,CIO
i 插入
- [root@oldboy34 tmp]# sed '2i aaaaaaaaaaaa' /tmp/person.txt
- 101,oldboy,CEO
- aaaaaaaaaaaa
- 102,zhangyao,CTO
- 103,Alex,COO
- 104,yy,CFO
- 105,feixue,CIO
多行增加
首先我们需要一个特殊符号 "\n", 这个符号叫做换行符
- [root@oldboy34 ~]# echo "oldboy";echo "oldboy"
- oldboy
- oldboy
- [root@oldboy34 ~]# echo -e "oldboy \noldboy"
- oldboy
- oldboy
- [root@oldboy34 ~]# sed '2a 106,yanghao \n107,lidao' /tmp/person.txt
- 101,oldboy,CEO
- 102,zhangyao,CTO
- 106,yanghao
- 107,lidao
- 103,Alex,COO
- 104,yy,CFO
- 105,feixue,CIO
- [root@oldboy34 tmp]# sed '2i 106,dandan,CSO\n107,bingbing,CCO\n108\n109' person.txt
- 101,oldboy,CEO
- 106,dandan,CSO
- 107,bingbing,CCO
- 108
- 109
- 102,zhangyao,CTO
- 103,Alex,COO
- 104,yy,CFO
- 105,feixue,CIO
删
指定执行的地址范围
地址范围 | 含义 |
10{sed-commands} | 对第 < span style="font-family: "Times New Roman"" ztid="347" ow="14" oh="15">10 行操作 |
10,20{sed-commands} | 对 < span style="font-family: "Times New Roman"" ztid="354" ow="14" oh="15">10 到 20 行操作,包括第 10 , 20 行 |
10,+20{sed-commands} | 对 < span style="font-family: "Times New Roman"" ztid="367" ow="14" oh="15">10 到 30 ( 10+20 )行操作,包括第 10 , 30 行 |
1~2{sed-commands} | 对 < span style="font-family: "Times New Roman"" ztid="382" ow="7" oh="15">1 , 3 , 5 , 7....... 行操作 |
10,${sed-commands} | 对 < span style="font-family: "Times New Roman"" ztid="395" ow="14" oh="15">10 到最后一行( $ 代表最后一行)操作,包括第 10 行 |
/oldboy/{sed-commands} | 对匹配 < span style="font-family: "Times New Roman"" ztid="406" ow="39" oh="15">oldboy 的行操作 |
/oldboy/,/Alex/{sed-commands} | 对匹配 < span style="font-family: "Times New Roman"" ztid="413" ow="39" oh="15">oldboy 的行到最后匹配 Alex 的行操作 |
/oldboy/,10{sed-commands} | 对匹配 < span style="font-family: "Times New Roman"" ztid="422" ow="39" oh="15">oldboy 的行到第 10 行操作 |
1,/Alex/{sed-commands} | 对第 < span style="font-family: "Times New Roman"" ztid="431" ow="7" oh="15">1 行到匹配 Alex 的行操作 |
/oldboy/,+2{sed-commands} | 对匹配 < span style="font-family: "Times New Roman"" ztid="440" ow="39" oh="15">oldboy 的行到其后的 2 行操作 |
/oldboy/,${sed-commands} | 对匹配 < span style="font-family: "Times New Roman"" ztid="449" ow="39" oh="15">oldboy 的行到最后一行操作 |
单行进操作
- [root@oldboy34 tmp]# cat person.txt
- 101,oldboy,CEO
- 102,zhangyao,CTO
- 103,Alex,COO
- 104,yy,CFO
- 105,feixue,CIO
- [root@oldboy34 tmp]# sed '2d' person.txt
- 101,oldboy,CEO
- 103,Alex,COO
- 104,yy,CFO
- 105,feixue,CIO
多行进行操作
- [root@oldboy34 tmp]# cat person.txt
- 101,oldboy,CEO
- 102,zhangyao,CTO
- 103,Alex,COO
- 104,yy,CFO
- 105,feixue,CIO
- [root@oldboy34 tmp]# sed '2,5d' person.txt
- 101,oldboy,CEO
- [root@oldboy34 tmp]#
删除不连续的行
- [root@oldboy34 tmp]# cat person.txt
- 101,oldboy,CEO
- 102,zhangyao,CTO
- 103,Alex,COO
- 104,yy,CFO
- 105,feixue,CIO
- [root@oldboy34 tmp]# sed '2d;5d' person.txt
- 101,oldboy,CEO
- 103,Alex,COO
- 104,yy,CFO
使用正则的方法
- [root@oldboy34 tmp]# sed '/oldboy/d' person.txt
- 102,zhangyao,CTO
- 103,Alex,COO
- 104,yy,CFO
- 105,feixue,CIO
- [root@oldboy34 tmp]# sed '/101/,/104/d' person.txt
- 105,feixue,CIO
改
整行替换 c
- [root@oldboy34 tmp]# cat person.txt
- 101,oldboy,CEO
- 102,zhangyao,CTO
- 103,Alex,COO
- 104,yy,CFO
- 105,feixue,CIO
- [root@oldboy34 tmp]# sed '2c 106,yanghao,CSO' person.txt
- 101,oldboy,CEO
- 106,yanghao,CSO
- 103,Alex,COO
- 104,yy,CFO
- 105,feixue,CIO
文本替换
sed 命令, 选项;
"s": 单独使用 --将每一行中第一处匹配的字符串进行替换
"g": 每一行进行全部替换 --sed 命令 s 的替换标志之一 (全局替换), 非 sed 命令
"i": 修改文件内容 --sed 软件的选项, 注意和 sed 命令区分.
g 表示行内全面替换.
p 表示打印行.
w 表示把行写入一个文件.
x 表示互换模板块中的文本和缓冲区中的文本.
y 表示把一个字符翻译为另外的字符 (但是不用于正则表达式)
\1 子串匹配标记
& 已匹配字符串标记
- [root@oldboy34 tmp]# sed 's#o#@#' person.txt
- 101,@ldboy,CEO
- 102,zhangya@,CTO
- 103,Alex,COO
- 104,yy,CFO
- 105,feixue,CIO
- [root@oldboy34 tmp]# sed 's#o#@#g' person.txt
- 101,@ldb@y,CEO
- 102,zhangya@,CTO
- 103,Alex,COO
- 104,yy,CFO
- 105,feixue,CIO
变量替换
- [root@oldboy34 tmp]# x=1
- [root@oldboy34 tmp]# echo "$x"
- 1
- [root@oldboy34 tmp]# y=2
- [root@oldboy34 tmp]# sed "s#$x#$y#g" person.txt
- 202,oldboy,CEO
- 202,zhangyao,CTO
- 203,Alex,COO
- 204,yy,CFO
- 205,feixue,CIO
查
"p"print 打印 输出指定内容, 但默认会输出 2 次匹配的结果, 因此使用 - n 选项取消默认输出
- [root@oldboy34 tmp]# sed -n '2p' person.txt
- 102,zhangyao,CTO
- [root@oldboy34 tmp]# sed -rn '/oldboy|yy/p' person.txt
- 101,oldboy,CEO
- 104,yy,CFO
企业案例: 批量重命名文件
- [root@oldboy34 tmp]# touch stu_102999_{1..5}_finished.jpg
- [root@oldboy34 tmp]# ll
- total 8
- -rw-r--r--. 1 root root 40 Feb 22 16:07 num.txt
- -rw-r--r--. 1 root root 71 Feb 22 15:58 person.txt
- -rw-r--r--. 1 root root 0 Feb 22 21:18 stu_102999_1_finished.jpg
- -rw-r--r--. 1 root root 0 Feb 22 21:18 stu_102999_2_finished.jpg
- -rw-r--r--. 1 root root 0 Feb 22 21:18 stu_102999_3_finished.jpg
- -rw-r--r--. 1 root root 0 Feb 22 21:18 stu_102999_4_finished.jpg
- -rw-r--r--. 1 root root 0 Feb 22 21:18 stu_102999_5_finished.jpg
- [root@oldboy34 tmp]# ls stu*|sed -r 's#(.*)(_finished)(.*)#mv & \1\3#g'
- mv stu_102999_1_finished.jpg stu_102999_1.jpg
- mv stu_102999_2_finished.jpg stu_102999_2.jpg
- mv stu_102999_3_finished.jpg stu_102999_3.jpg
- mv stu_102999_4_finished.jpg stu_102999_4.jpg
- mv stu_102999_5_finished.jpg stu_102999_5.jpg
- [root@oldboy34 tmp]#ls stu*|sed -r 's#(.*)(_finished)(.*)#mv & \1\3#g'|bash
- [root@oldboy34 tmp]# ll
- total 8
- -rw-r--r--. 1 root root 40 Feb 22 16:07 num.txt
- -rw-r--r--. 1 root root 71 Feb 22 15:58 person.txt
- -rw-r--r--. 1 root root 0 Feb 22 21:18 stu_102999_1.jpg
- -rw-r--r--. 1 root root 0 Feb 22 21:18 stu_102999_2.jpg
- -rw-r--r--. 1 root root 0 Feb 22 21:18 stu_102999_3.jpg
- -rw-r--r--. 1 root root 0 Feb 22 21:18 stu_102999_4.jpg
- -rw-r--r--. 1 root root 0 Feb 22 21:18 stu_102999_5.jpg
来源: http://www.bubuko.com/infodetail-2629999.html