目录
sed是一种流编辑器
三个过程
- 读取: 读取: 目标文件 的每行数据依次加入缓冲区(模式空间)里,默认从第一行开始读取
- 执行:使用定义的增删改查命令来处理读取到暖冲区行数据
- 显示:将处理后的行数据输出到屏幕显示
命令格式
单个操作命令格式
sed -e '操作命令' 目标文件1 目标文件2 #对目标文件1 目标文件2进行操作
sed 命令选项 -e '操作命令' 目标文件1 目标文件2 #对目标文件1 目标文件2进行操作
多个操作命令格式
sed -e '操作1' -e '操作2' 目标文件1 目标文件2 #对目标文件1 目标文件2进行多个操作
sed -e '{ #对目标文件1 目标文件2进行多个操作
操作1 {} 可以省略
操作2
}' 目标文件1 目标文件2
sed -n -e '操作1;操作2' 目标文件1 目标文件2 #对目标文件1 目标文件2进行多个操作
脚本文件里定义
sed -f 脚本文件 目标文件1 目标文件2 #通过脚本里的操作对目标文件进行操作
命令选项
常用选项:
sed -e 或 --expression= #用指定操作处理文件;只有一个操作命令时可以省略
-f 或 --file= #用指定脚本文件来处理
-n 或 --quiet 或 silent #禁止sed编辑器输出,但可以与p命令一起使用完成输出
-i #直接修改目标文本文件
-r #使用正则表达式使用(复杂就用)
-h 或 --help #显示帮助
操作命令
常用操作 :
- p #打印,如果同时指定行,表示打印指定行内容; 如果不指定行,则表示打印所有内容; 如果有非打印字符,则以ASCII 码输出。其通常与“-n”选项一起使用
- =: #打印行号
- n: #跳到下一行
- d: #删除,删除选定的行
- s: #替换,替换指定字符
- c: #替换,将选定行替换为指定内容
- y: #替换字符,转换前后的字符长度必须相同
- w: #只保存修改过的内容到另一个文件
- i : #增加;在指定行的上一行插入指定内容
- a: #增加;在指定行的下一行插入指定内容
- l(小写L): #打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t.)
使用地址
sed两种寻址方式:
- 以数字形式表示区间
- 用文本模式来过滤行
打印内容
常用操作命令:p (通常加-n) , = , n
sed -n 'p' 目标文件 #打印目标文件所有内容
sed -n '=' 目标文件 #打印目标文件的行号
sed -n '=;p' 目标文件 #打印目标文件的行和内容
sed -n '5p' 目标文件 #打印第5行的内容
sed -n '1,3p' 目标文件 #打印1到3行的内容
sed -n 'p;n' 目标文件 #打印奇数行内容
sed -n 'n;p' 目标文件 #打印偶数行内容
sed -n '2,${n;p}' 目标文件 #打印第三行开始的奇数行
sed -n '1~2p' 目标文件 #打印奇数行内容 1表示第一行开始 ~2 表示每间隔2行
sed -n '/user/p' 目标文件 #打印含有user行的内容
sed -n '2,/user/p' 目标文件 #打印第二行到第一个含有user行的内容
sed -n '/ftp\/root/p' 目标文件 #打印包含/ftp/root行的内容 与格式一样用 \ 进行转义
sed -n '1,+3p' 目标文件 #打印1之后连续的3行,即1到4行
sed -nr '/ro{1,}t/p' 目标文件 #-r表示支持扩展正则表达式
删除行
常用操作命令:d
sed 'd' 目标文件 #删除全部内容
sed '3d' 目标文件 #删除第三行内容
sed '2,4d' 目标文件 #删除2到4行内容
sed '/^$/d' 目标文件 #删除空行
sed '/bash$/!d 目标文件 #删除除了bash结尾的行; !表示取反
替换
常用操作命令:s ; c ; y ;g ; w
行范围 s/旧字符/新字符/替换标记
sed 's/zx/jlh/' 目标文件 #将第一个zx替换成jlh
sed 's/zx/jlh/g' 目标文件 #将所有的zx替换成jlh
sed 's/zx/jlh/gp' 目标文件 #将所有的zx替换成jlh并打印
sed '1,5s/zx/jlh/' 目标文件 #将1到5行的每行第一个zx改为jlh
sed '1,5s/zx/jlh/g' 目标文件 #将1到5行所有的zx改为jlh
sed '/root/ s/^/#/' 目标文件 #将root所在行添加#
sed -rn 's/.*root.*/#&/p' /etc/passwd #将root所在行添加#
sed '1,20s/^/#/w out.txt' 目标文件 #将1到20行添加#,并修改内容输出到out.txt
sed '1,20s/^/#/' 目标文件 > 新文件 #将1到20行添加#,将所有内容输出到新文件
sed -n 's/\/bin\/bash/\/bin\/csh/gp' /etc/passwd #将/bin/bash全部替换成/bin/cash并打印
sed -n 's!/bin/bash!/bin/csh!p' /etc/passwd #使用“!”作为字符串分隔符
sed -i 's9\945\9\99\98\939g' test.txt #将94599全部替换为9893
sed '5c jlh' 目标文件 #将第五行内容替换成jlh
sed 'y/145/ADE' #所有的1替换成A 要对应
所有的2替换成D
所有的3替换成E
echo 111222333 | sed -r 's/(111)(222)(333)/\3\2\1/' #将111222333 替换成 333222111
插入行内容
常用操作命令:i ; a
sed '1i zero' 目标文件 #在首行上插入zero
sed '$a zero' 目标文件 #在最后一行后插入zero
sed '1,3a zero' 目标文件 #在1到3行,每一行插入zero
sed '/one/a zero' 目标文件 #通过内容插入
复制粘贴行内容
常用操作命令:H ; G
复制完行之间会有空格
sed '1H;$G' 目标文件 #粘贴第一行到最后
sed '1,3{H;D};$G' 目标文件 #剪切1到3行 复制到最后一行