目录
sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
sed的工作流程主要包括读取、执行和显示三个过程:
读取: sed从输入流 (文件、管道、标准输入) 中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)
执行:默认情况下,所有的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 -n '1p' testfile1 ##只打印第一行内容
- sed -n '$p' testfile1 ##打印最后一行内容
- sed -n '1,3p' testfile1 ##打印1-3行内容
- sed -n '1,+3p' testfile1 ##打印第一行内容和连续三行内容
- sed '5q' testfile1 ##q表示退出,5q表示打印五行之后退出



- sed -n 'p;n' testfile1 ## n:移动到下一行,打印奇数行
- sed -n 'n;p' testfile1 ##打印偶数行

- 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行之间的所有行

sed -rn '/r.{1,}t/p' /etc/passwd
- sed '3d' test ##删除第三行内容
- sed '1,3d' test ##删除1-3行内容
- sed '/^s/d' testfile1 ##删除以s开头的行
- sed '/en$/d' testfile1 ##删除以en为结尾的行
- sed '/en$/!d' testfile1 ##!表示取反,删除除以en结尾的所有行
- sed '/2/,/3/d' testfile1 ##从第一个包含2的行开始删,删到第一个包含3的行,第一位置打开删除功
- 能,第二位置关闭删除行功能 容易发生误删操作
- sed '/^$/d' test ##删除空行
- grep -v "^$" file.txt ##过滤出非空行
- cat file.txt |tr -s "\n" ##压缩换行符

s:替换字符串
c:整行替换
y:字符替换,替换前后的字符串长度必须相同
格式:
行范围 s/旧字符串/新字符串/替换标记

- sed -n '/^root/ s/^/#/p' /etc/passwd ##过滤出以root开头的行,在行首加上#
-
- sed -n '/^root/ s/^//' /etc/passwd ##删除注释

- s/[a-z]/\u&/g 小写转大写
- s/[A-Z]/\l&/g 大写转小写
- s/\a[a-z]/\u&/g 首字母小写转大写

sed '/88/c 22' 7.txt

sed '1,3a 123' testfile1 ##在第1~3行,每行下方添加一行内容

比较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粘贴到指定行下方
sed '1,3{H;d};$G' 7.txt
sed '1,3H;$G' testfile1 ##将1-3行复制粘贴到最后一行后面