文本编辑三剑客: sed 、grep、awk都是针对文件内容的行来进行编辑处理
sed介绍
概述:类似于vim文本编辑器,但是是按行进行编辑处理,sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。
接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
Sed作用:
用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序
sed的工作原理:
读取、执行、显示三个过程
读取: sed从输入流 (文件、管道、标准输入) 中读取一行内容并存储到临时的缓冲区中(又称模式空间)
执行: 默认情况下,模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行。
显示:在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行, 直至所有内容被处理完。
执行完成后,把执行结果打印,如果要改变生效模式空间被修改的内容,会写入到指定的文件当中,只有操作但是不最终写入文件,只展示结果,展示完成后,模式空间的数据会被立即删除
面试题1、
sed文本内容处理空间,文件过大怎么办
1、split -l 按行切割
2、cat 文件名 | sed 处理 只能处理中型文件,大型文件需要先分割
sed 实际操作
常用选项
-e : 条件操作选项,表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用
sed -e '操作' 文件1 文件2
-f 指定脚本文件来进行处理输出的文件内容,把命令写在脚本里,用脚本里的命令处理第二个文件里的内容
格式:
sed -f 脚本文件 文件1 文件2
-i : 直接修改目标文本文件 慎用
-n : 仅显示script处理后的结果,禁止sed的默认输出,打印一份
sed操作符
(需要单引号引起来)
s:替换,替换指定字符
d:删除,删除选定的行
a:增加,在当前行下面插入一行指定内容
i:插入,在选定行上面插入一行指定内容
c:替换,将选定行替换为指定内容
y:字符转换,转换前后的字符长度必须相同
p:打印,
sed核心: 就是增删改查,查的功能没有grep 强大
命令模式
查看
sed ' ' :打印功能(用单引号)
1、sed ‘ ’ /etc/passwd
2、cat /etc/passwd | sed ‘ ’
3、sed ‘ ’ < /etc/passwd
sed 有自己的一个默认输出,p 打印会额外再来一行
sed -“p” ky30.txt
sed -n '=' ky30.txt
sed -n '=;p' ky30.txt 即显示行号,也显示行对应的内容
sed 打印指定行,
1、寻址打印
sed -n '1p' ky30 打印第一行
sed -n '4p' ky30 打印第四行
sed -n '$p' ky30 打印最后一行
2、行号范围区间打印
sed -n '1,3p' ky30 打印第一行到第三行
打印第二行到最后一行,sed -n‘2,$p’ ky30
行号范围打印
“ , ” : 表示到,第一行到第四行
“ ;” : 表示和,第一行和第四行
奇数行和偶数行的打印
sed -n ''n;p" ky30 偶数行打印
“n”表示跳过第一行,打印一行,在跳过一行
sed -n ' p; n' ky30 奇数行打印
文本过滤模式
对包含指定字符串的内容进行打印
格式:sed -n '/ /'
sed -n '/o/p'ky30 打印包含“o”的行进行打印
“o” 可以是单个字符,也可以是字符串
运用基础正则表达式进行打印
sed -n ' /^root/p' /etc/passwd
sed -n ' /bash$/p' /etc/passwd
删除
sed 'd' ky30
指定行进行删除
sed -n ' 3d;p' ky30 删除第三行,打印剩余的
sed -n ‘1d ;3d;p’ ky30 删除第一行和第三行打印剩余的
匹配字符串内容进行删除
sed '/o/d' ky30
sed '/big/1d' ky30 除了big的那行其余全部删除
正则表达式的删除
删除空行: sed ' /^$/d' ky30
sed 替换
替换的操作符
s: 替换字符串
c: 整行替换
y: 单字符替换,
字母字符的大小写替换
sed 's/[a-z]/\u&/g ' ky30 小写全部替换大写
sed 's/[A-Z]/\l&/g' ky30 大写全部替换成小写
l&: 转换成小写的特殊符号,在使用时需要转义符
u& : 转换成大写的特殊符号,在使用时需要转义符
g : 全部替换,如果不加只会更改首字母
整行替换
sed '/exy/ c boge is sexy ' ky30
将exy全部替换为boge is sexy (需要完全匹配)
单字符替换
sed 'y/any/123/' ky30 (必须前后长度一致)
增
选项 ;
a : 在下一行添加
i:在上一行添加
r:在行后读写文件内容
sed ‘/boge/ a123’ ky30 在boge 下一行添加
sed ‘/bighouse/r ky31 ’ ky30 在bighouse行后读取ky31的内容
第一个文件是要读取内容的文件,第二个是要制定操作的文件
sed命令当中字符串位置进行交换
echo ky30boge | sed -r's/(ky30) (boge)/\2\1/'