详细的sed命令详解,请参考https://my.oschina.net/u/3908182/blog/1921761
https://www.cnblogs.com/zoe233/p/11920446.html
sed命令常见用途
- 查找关键词做全局替换
- 查找某行的关键词做替换
- 查找关键字所在行,并且执行指定关键字的替换
- 在某行之后追加
- 查找关键字,并且在第二行追加
- 删除包含关键字的行
- 查看指定的行
- 在最后一行追加
- sed -e 参数,屏幕输出,一次更改多替换文本中多个值
1. 查找关键词做全局替换
sed -i 's/GSSAPIAuthentication yes/GSSAPIAuthentication no/g' /etc/ssh/sshd_config
2. 查找/etc/crontab 第17行,并且把0,30替换为15,45
sed -i '17s/0,30/15,45/' /etc/crontab
3. 查找/etc/crontab 中的关键字script.sh,并且把15,45替换为0,30
sed -i '/script.sh/s/15,45/0,30/' /etc/crontab
4. 在第17行后添加新的 一行内容
sed -i '17a * * * * root /root/test.sh' /etc/crontab
5. 在/etc/crontab中查找关键字script,并且该关键字的下一行追加一行新内容
sed -i '/^.*script.*$/a30,45 * * * * root /root/check.sh' /etc/crontab
6. 在/etc/crontab中查找关键字check.sh,并且把这行的内容替换掉
sed -i '/^.*script.*$/c30,45 * * * * root /root/check.sh' /etc/crontab
7. 在/etc/crontab中查找关键字check.sh,并且删除该行
sed -i '/check.sh/d' /etc/crontab
8. 显示第17到18行之间的内容
sed -n '17,18p' /etc/crontab
9. 在最后一行追加一行0 * * * * root /root/check.sh
sed -i '$a * * * * root /root/check.sh' /etc/crontab
10. sed 命令处理换行符,例如替换或者删除
sed ':label;N;s/ /:/;b label' filename sed ':label;N;s/ /:/;t label' filename
上面的两条命令可以实现将文件中的所有换行符替换为指定的字串,如命令中的冒号。命令的解释:
:label; 这是一个标签,用来实现跳转处理,名字可以随便取(label),后面的b label就是跳转指令
N; N是sed的一个处理命令,追加文本流中的下一行到模式空间进行合并处理,因此是换行符可见
s/
/:/; s是sed的替换命令,将换行符替换为冒号
b label 或者 t label b / t 是sed的跳转命令,跳转到指定的标签处
标签跳转和N的追加命令实现了每一行的不间断放入模式处理空间,从而不会漏掉每一个换行符,而没有标签的话跳转的话,就只能每两行替换掉一个换行符,对比效果:
$ echo "a,b,c,d" |sed 's/,/ /g'|sed ':x;N;s/ /,/;b x' a,b,c,d $ echo "a,b,c,d" |sed 's/,/ /g'|sed 'N;s/ /,/' a,b c,d
10. sed -e参数,并不真正编辑源文件,只是屏幕输出
一条sed命令,删除/etc/passwd第三行到末尾的数据,并把bash替换为blueshell
nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/' 1 root:x:0:0:root:/root:/bin/blueshell 2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh
e表示多点编辑,第一个编辑命令删除/etc/passwd第三行到末尾的数据,第二条命令搜索bash替换为blueshell。
如果只是处理一个东西,可以省略-e ,接多个就不能省略