读取文本内容,根据指定的条件进行处理。是一个类似于vim的文本编辑器,但它是按行来进行编辑和处理。所以sed的主要作用就是对文本内容进行增删改查。
sed可以支持正则表达式,但不是完全依赖正则表达式,也可以支持扩展正则表达式
读取----->执行----->显示
读取:读取文本内容之后会把读取到的内容存放到临时的缓冲区(模式空间)
执行:在模式空间,根据读取的文本内容,按行执行,除非指定行号,否则会遍历所有行,从上往下依次执行。
显示:执行完之后,把执行结果打印,如果需要将改变内容生效,模式空间被修改的内容会写入到指定的文件当中。只是操作,但是最终不写文件,只显示结果,展示完之后,模式空间的数据就会立即删除
sed -e '操作' 文件1 -e '操作' 文件2
只对一个文件操作,可以不加e
-e:条件操作选择
-f:指定脚本文件来处理输入的文件内容。把命令卸载到脚本里,用脚本里的命令来处理第二个文件里面的内容
-i:立即生效,慎用
-n:显示script处理之后的结果,禁止sed的默认输出
s:替换,替换指定的字符
d:删除,删除指定的行
a:增加,在当前行的下一行插入指定内容
i:增加,在指定行的上一行插入指定内容
c:替换,整行替换
y:替换,替换字符,替换前后的字符长度必须一致
r:扩展正则
p:打印
=:打印行号
np:打印第n行
$p:打印最后一行
n,mp:打印n-m行
np;mp:打印n和m行
n;p:打印偶数行
p;n:打印基数行
文本过滤:
对包含指定字符串的内容进行打印 '/big/p':所有包含big的行都会全部打印
应用基本正则表达式进行打印: /bash$/p:打印以bash为结尾的行
应用扩展正则表达式进行打印: -r -n '/(99:){2}/p' /etc/passwd
nd;p:指定行号进行删除
1d;3d;p:删除第1行和第3行
/o/d:指定字符串删除
/big/d:删除big所在的行
/one/,/six/d:删除one到six所在的行
/^$/d:删除空行
s:字符串替换
c:整行替换
y:单字符替换,前面长度要保持一致
例:
sed -n 's/root/test/gp' /etc/passwd:把所有的root都替换成test
把第一个以root开头的注释掉也就是在前面加个#号
sed -r -n 's/^root/#root/p' /etc/passwd
sed -r -n '/^root/ s/^/#/p' /etc/passwd
sed 's/[a-z]/\ u&/g' 文件名:小写改大写,全部修改加上g
sed 's/[A-Z]/\ l&/g' 文件名:大写改小写,全部修改加上g
l&:转换成小写的特殊符号,在使用时,需要转义符\
u&:转换成大写的特殊符号,在使用时,需要转义符\
整行替换:c
sed '/exy/c boge is exy' ky30.txt
单字符替换:y
sed 'y/a/1/' ky30
a在下一行添加
sed '/one/a two' ky30.txt
i在上一行添加
sed '/one/i two' ky30.txt
r在行后读入指定文件的内容
sed '/one/r ky31.txt' ky30.txt
面试题:
一、sed文本内容处理工具文件过大怎么办
1.split -l
2.split -b
3.cat 文件名 | sed处理 -----中型文件,大型文件,还是先分割的好
二、怎么样不进入文件就可以删除文件当中的内容,免交互删除
1.sed -i 'd' 文件名
2.cat /dev/null > 文件名
三、sed命令当中字符串的位置进行交换
echo ky30ergedage | sed -r 's/(ky30)(erge)(dage)/\3\2\1/'
四、提取版本号
sed -r 's/(.*)-(.*)(\.jar)/\2/' number.txt
grep -E "[0-9]+." ms.txt
五、查看tail -f messages 去匹配的范围内进行打印
sed -n 'Jul 20 11:30:01/,/Jul 20 12:00:01'
六、把网卡的指定ip地址换掉
sed '/准备更换的内容/c /替换的内容/' /etc/sysconfig/network-scripts/ifcfg-ens33