目录
一、概念
sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
二、sed工作流程
sed的工作流程主要包括读取、执行和显示三个过程:
读取: sed从输入流 (文件、管道、标准输入) 中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)
执行:默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行。
显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
- 在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
- 注意 : 默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。
三、sed命令格式
格式:
sed -e '操作' 文件1 文件2
sed -n -e '操作' 文件1 文件2
sed -f 脚本文件 文件1 文件2
sed -i -e '操作' 文件1 文件2
执行多条命令三种方法:
sed -n -e '操作1' -e '操作2' 文件
sed -n -e '操作1;操作2' 文件
sed -e 'n{
操作1
操作2
......
}' 文件1
常用选项:
常用操作:
s:替换,替换指定字符。
d:删除,删除选定的行。
a:增加,在当前行下面增加一行指定内容。
i:插入,在选定行上面插入一行指定内容。
c:替换,将选定行替换为指定内容。
y:字符转换,转换前后的字符长度必须相同。
p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用。
=:打印行号。
l(小写L):打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t)
四、sed之查找
4.1 指定打印行
sed -n '1p' testfile1 ##只打印第一行内容
sed -n '$p' testfile1 ##打印最后一行内容
sed -n '1,3p' testfile1 ##打印1-3行内容
sed -n '1,+3p' testfile1 ##打印第一行内容和连续三行内容
sed '5q' testfile1 ##q表示退出,5q表示打印五行之后退出
4.2 打印奇数行和偶数行
sed -n 'p;n' testfile1 ## n:移动到下一行,打印奇数行
sed -n 'n;p' testfile1 ##打印偶数行
4.3 过滤文本所在的行
sed -n '/root/p' /etc/passwd ##过滤出包含root的行
sed -n '/^l/p' /etc/passwd ##过滤出以l开头的行
sed -n '/n$/p' /etc/passwd ##过滤出以n结尾的行
sed -n '/mail|games/p' /etc/passwd ##过滤出以mail开头或者以games结尾的|是特殊字符需要在前面加\
sed -n '2,/rpcbind/p' /etc/passwd ##打印从第一个包含2的行到第一个包含rpcbind行之间的所有行
4.4 -r表示支持扩展正则表达式
sed -rn '/r.{1,}t/p' /etc/passwd
五、sed之删除
5.1 删除指定行内容
sed '3d' test ##删除第三行内容
sed '1,3d' test ##删除1-3行内容
5.2 删除包含指定内容的行
sed '/^s/d' testfile1 ##删除以s开头的行
sed '/en$/d' testfile1 ##删除以en为结尾的行
sed '/en$/!d' testfile1 ##!表示取反,删除除以en结尾的所有行
sed '/2/,/3/d' testfile1 ##从第一个包含2的行开始删,删到第一个包含3的行,第一位置打开删除功
能,第二位置关闭删除行功能 容易发生误删操作
5.3 删除空行的三种方法
sed '/^$/d' test ##删除空行
grep -v "^$" file.txt ##过滤出非空行
cat file.txt |tr -s "\n" ##压缩换行符
六、修改替换s c y
s:替换字符串
c:整行替换
y:字符替换,替换前后的字符串长度必须相同
格式:
行范围 s/旧字符串/新字符串/替换标记
6.1 添加注释 删除注释
sed -n '/^root/ s/^/#/p' /etc/passwd ##过滤出以root开头的行,在行首加上#
sed -n '/^root/ s/^//' /etc/passwd ##删除注释
6.2 将所有字母改成大写字母
s/[a-z]/\u&/g 小写转大写
s/[A-Z]/\l&/g 大写转小写
s/\a[a-z]/\u&/g 首字母小写转大写
6.3 整行替换C
sed '/88/c 22' 7.txt
七、sed之插入
sed '1,3a 123' testfile1 ##在第1~3行,每行下方添加一行内容
八、 sed 之复制粘贴
比较vi/vim编辑器和 sed编辑器:
#vi//vim编辑器:
命令模式
dd p 剪切 粘贴
yy p 复制 粘贴
末行模式
:1,3 co 10 复制 粘贴(将第1~3行复制粘贴到第10行下方)
:1,3 m 10 剪切 粘贴(将第1~3行剪切到第10行下方)
#sed命令:
H复制、d删除、G粘贴到指定行下方
8.1 剪切粘贴
sed '1,3{H;d};$G' 7.txt
8.2 复制粘贴
sed '1,3H;$G' testfile1 ##将1-3行复制粘贴到最后一行后面