1.流编辑器sed:不需要与人进行交互,修改文件是重点
- sed工作流程
(1)sed是一种在线的,非交互式的编辑器,它一次处理一行内容。
处理时,把当前处理的行存储在临时缓冲区中。称之为模式空间pattern space。
接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。
接着处理下一行,这样不断重复,直到文件末尾。
文件内容并没有改变,除非你使用重定向存储输出。
Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序。
- 命令格式
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
注意:
sed和grep不一样,不管是否找到指定的模式,它的退出状态都是0
只有当命令存在语法错误时,sed的退出状态才是非0
sed -ri bak
sed -ric --follow-symlinks
- 支持正则表达式
(1)与grep一样,sed在文件中查找模式时,也可以使用正则表达式RE和各种元字符。
(2)正则表达式是括在斜杠间的模式,用于查找和替换 ,以下是sed支持的元字符
(3)使用基本元字符集:^ ,$, .,*,[],[^],\ <\ >,\ (\ ),{ \ }
(4)使用扩展元字符集:?,+,{ },|,( )
(5)使用扩展元字符的方式:\ +,sed -r - eg:
sed 'd' passwd 读一行到模式空间就删除
sed '4,7d' passwd 删除文件4-7行, 没有真正修改文件
sed '4,7di' passwd 删除文件4-7行 ,真正修改文件!!
sed --help|grep '\-r'
sed -ri -i表示真改文件 -r表示支持扩展元字符
- eg:
sed -r 'p' /etc/passwd p表示打印,读一行打印一行
sed -r -n 'p' /etc/passwd -n表示静默的方式,单纯的执行p,所以n和p基本一起用
sed -r -n '/root/p' /etc/passwd 打印只有root的行
sed -r -n '/root/=' /etc/passwd 打印只有root的行的行号
查找和替换
sed -r 's/root/alice/' /etc/passwd s表示search查找,查找所有行,读一行到模式空间,这么去做
sed -r 's/root/alice/g' /etc/passwd g表示全局,一行所有的
sed -r 's/root/alice/gi' /etc/passwd i表示忽略大小写
查找
sed -r '/root/d' /etc/passwd 在模式空间删除带有root的行
将路径进行查找和替换
u.txt的内容:
/etc/abc/456换成:/var/wangji
sed -r '/\/etc\/abc/\/var\/wangji\//' u.txt sed -r '/ 路径1 / 路径2 /' u.txt,记得加上转义
grep和sed替换文件中的字符串
sed -i s/"str1"/"str2"/g ` grep "str1" -rl --include= "*. [ch]"./` 将当前目录下的所有.c、.h文件中的str1字符串替换为str2字符串。
2.sed地址(定址)
- 地址用于决定对哪些行进行编辑。地址形式可以是数字,正则表达式或者二者的结合。
如果没有指定地址,sed将处理输入文件中的所有行
sed '1,3d' passwd 删除1到3行
sed -r 's/root/wangji/g' /etc/passwd 将每行的root替换成wangji
sed -r '/^bin/,5d' passwd 删到第5行
sed -r '/^bin/,+5d' passwd 从bin开始的行,再连删5行
sed -r ‘/root/d’ passwd 将带有root的行删除
sed -r ‘/root/!d’ passwd 除了带有root的行都删除
sed -r ‘1~2d’ passwd 从第一行开始,每间隔2行删除,即:删除所有奇数行
3.sed命令
-
sed命令告诉sed对指定行进行何种操作,包括打印,删除,修改等
-
eg:
删除命令:d
sed -r '3{h;d}' passwd {}表示有多个命令,对于每行,先暂存,再删除
sed -r '$d' passwd 删除最后有一行
替换命令:s
sed -r ‘1,5s/(.*)/#\1/’ passwd ()不需要加\,因为有-r。将1-5行最前面加上#
sed -r 1,5s/^/#/
sed -r 's/[0-9][0-9]$/&.5' passwd &表示查找串中匹配到的内容,将两个数字结尾的后面加上.5
读文件命令:r
sed -r '/Suan/r /etc/newfile' datafile 将newfile的内容读入到带有Suan的行
写文件命令:w
sed -r '/root/w /tmp/1.txt' datafile 凡是root行保存到/tmp/1.txt文件中
追加:a,i,替换命令:c
sed -r '/root/awwwwwwwww' passwd 处理到root的行,在下一行追加一个wwwwwwwww
sed -r '2a111111111' passwd 在第2行的下一行追加11111
sed -r '/root/iwwwwwwwww' passwd 处理到root的行,在上一行追加一个wwwwwwwww
sed -r '/root/cwwwwwwwww' passwd 用wwwwwwwww替换root的行
获取下一行命令:n:next
sed -r '/adm/{n;d}' passwd 删除匹配adm的那行的下一行,d可以换成s/sbin/wangji/,表示将这下一行的sbin换成wangji
所以,类似下下行
sed -r '/adm/{n;n;d}' passwd
4.sed的暂存空间
- 模式空间->暂存空间:h和H
小写是覆盖,大写是追加 - 暂存空间->模式空间:g和G
小写是覆盖,大写是追加
- eg
默认情况下,暂存空间里面是个换行符(空行)
sed -r 'g' file 处理第一行时,从暂存空间拿过来一个换行符,拿来覆盖,第二行类推
sed -r 'G' file 处理第一行时,从暂存空间拿过来一个换行符,拿来追加,这行下面会增加一个空行,第二行以此类推
暂存和取用命令:h,H,g,G
sed -r '1h;$G' /etc/hosts 把/etc/hosts的第1行覆盖写到暂存空间(模式空间只有1行,暂存空间只有1行),
然后把暂存空间的内容追加到/etc/hosts的最后1行
(相当于把/etc/hosts的第1行复制到最后一行)
sed -r '1{h;d};$G' /etc/hosts 把第1行覆盖写到暂存空间,并删除/etc/hosts的第1行,然后把暂存空间的内容追加到最后一行(相当于把/etc/hosts的第1行复制到最后一行,并删除第1行)
sed -r '1h;2,$g' /etc/hosts 把第1行放到暂存空间,然后将暂存空间的内容放到第2行至最后一行
sed -r '1h;2,3H;$G' /etc/hosts 把第1,2,3行放到模式空间,然后追加到 /etc/hosts文件的最后一行
反向选择:!
sed -r '3!d' /etc/hosts 除了第3行外都删除