命令简介:
sed(Stream Editor)被称作流编辑器。linux命令环境的“三剑客”(grep,sed,awk)之一,功能强大,可以根据命令来处理数据流中的数据,命令可以在命令行中,也可以出现在一个文本文件中。
sed一般会执行下列操作:
①一次从输入中读取一行数据;
②根据所提供的编辑器命令匹配数据;
③按照命令修改流中的数据;
④将新的数据输出到STDOUT(屏幕上);
在流编辑器将所有命令与一行数据匹配完毕后,它会读取下一行数据并重复这个过程。在流编辑器处理完流中的所有数据行后,它就会终止。
必备知识:
正则表达式
速记参考:http://man.linuxde.net/docs/shell_regex.html
测试环境:
CentOS 7.x
具体实例:
说明:以下例子来自网络整理,可能某些问题用sed并非简便,此处拿来仅供学习,实际匹配操作根据不同文本文件环境做轻微调整,主要涉及到了常见的实用操作(打印、删除、替换、交换、提取等)。
打印
1. 打印第一行
~]# sed -n '1p' passwd
2. 打印最后一行
~]# sed -n '$p' passwd
3. 打印第三行
~]# sed -n '3p' passwd
4. 打印第三行到第八行
~]# sed -n '3,8p' passwd
5. 打印第三行和第5行
~]# sed -n '3p;5p' passwd
6. 打印第三行和第五号到第八行
~]# sed -n '3p;5,8p' passwd
7. 打印奇数行
~]# sed -n 'p;n' passwd
8. 打印偶数行
~]# sed -n 'n;p' passwd
9. 打印每行3次
~]# sed 'p;p' passwd
~]# sed -n 'p;p;p' passwd
10. 打印以mail开始的行
~]# sed -n '/^mail/p' passwd
删除(一般删除)
1. 删除空白行(打印非空行)
~]# sed '/^$/d' passwd
~]# grep -v "^$" passwd
~]# awk '{if($0!="") print}' passwd
~]# awk '{if(length!=0) print}' passwd
~]# cat passwd |tr -s '
'
2. 删除第二行
~]# sed '2d' passwd
3. 删除第二行到第五行
~]# sed '2,5d' passwd
4. 删除第二行和第五行到第八行
~]# sed '2d;5,8d' passwd
5. 删除最后一行
~]# sed '$d' passwd
6. 删除奇数行
~]# sed '1d;n;d' passwd
~]# sed '1~2d' passwd
7. 删除偶数行
~]# sed '2d;n;d' passwd
~]# sed '2~2d' passwd
删除(替换思想)
1. 删除每行开头的所有空格
~]# sed 's/^ *//' passwd
~]# sed 's/^ *//' passwd
~]# sed -r 's/( *)(.*)/2/' passwd
2. 删除每行第一个字符
~]# sed 's/.//' passwd
~]# sed 's/^.//g' passwd
~]# sed -r 's/(.)(.*)/2/' passwd
3. 删除每行最后一个字符
~]# sed 's/.$//' passwd
~]# sed -r 's/(.*)(.)/1/' passwd
4. 删除每行第四个字符
~]# sed 's/.//4' passwd
5. 删除每行倒数第二个字符
~]# sed -r 's/(.*)(.)(.)/13/' passwd
6. 删除所有的数字
~]# sed -r 's/[0-9]*//g' passwd
~]# sed -r 's/[0-9]//g' passwd
7. 删除每行第二个单词
~]# sed -r 's/([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]+)(.*)/1245/' passwd
~]# sed -r 's/([^a-Z]*)([a-Z]+)([^a-Z]+)([a-Z]+)(.*)/1235/' passwd
~]# sed -r 's/(^[^a-Z]*)([a-Z]+)([^a-Z]+)([a-Z]+)/123/' passwd
8. 删除每行倒数第二个单词
~]# sed -r 's/(.*)([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]*)/12456/' passwd
~]# sed -r 's/([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]*)$/1345/' passwd
9. 删除每行最后一个单词
~]# sed -r 's/(.*)([^a-Z]+)([a-Z]+)/12/' passwd
~]# sed -r 's/(.*)([^a-Z]+)([a-Z]+)([^a-Z]*)/124/' passwd
替换
1. 用制表符替换文件中出现的所有空格
~]# sed -r 's/ / /g' passwd
2. 把所有小写字母用括号()括起来
~]# sed 's/[a-z]/(&)/g' passwd //用&代表前面匹配到的字母
3. 将格式 2018/12/31 换成 2018-12-31
~]# echo "2018/12/31" | sed 's#/#-#g'
4. 将文件中所有的root单词替换成大写的ROOT
~]# sed 's/<root>/ROOT/g' passwd
交换(替换思想)
1. 交换每行的第一个字符和第二个单词
~]# sed -r 's/^(.)([^a-Z]*)([a-Z]+)([^a-Z]+)([a-Z]+)/52341/' /etc/passwd
2. 交换每行的第一个单词和最后一个单词
~]# sed -r 's/([^a-Z]*)([a-Z]+)([^a-Z]+)(.*)([^a-Z]+)([a-Z]+)/163452/' passwd
3. 交换每行的倒数第二个单词和最后一个单词
~]# sed -r 's/([^a-Z]+)([a-Z]+)([^a-Z]+)([a-Z]+)([^a-Z]*)$/14325/' passwd
插入(i,a)
1. 在第一行上插入
~]# sed '1iat the top' passwd
2. 在匹配行上插入
~]# sed '/^the/iI am here' passwd
3. 在第二行下面插入
~]# sed '2aI am here' passwd
4. 在最后一行下面插入
~]# sed '$aat the bottom' passwd
结束.
不定时更新,如有不解,欢迎留言交流 ^_^