sed介绍
sed是Stream Editor(流编辑器)的缩写,简称流编辑器;用来处理文件的。
原理:
sed是一行一行读取文件内容并按照要求进行处理,把处理后的结果输出到屏幕。
首先sed读取文件中的一行内容,把其保存在一个临时缓存区中(也称为模式空间)。
然后根据需求处理临时缓冲区中的行,完成后把该行发送到屏幕上。
总结:
由于sed把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会直接修改原文件。
sed的命令行使用
sed常见的语法格式有两种,一种叫命令行模式,另一种叫脚本模式。
命令行语法格式:
sed [options] '处理动作' 文件名
常用选项
常见处理动作
注意:以下所有的动作都要在单引号里
动作 | 说明 |
‘p’ | 打印 |
‘i’ | 在指定行之前插入内容 |
‘a’ | 在指定行之后插入内容 |
‘c’ | 替换指定行的所有内容 |
‘d’ | 删除指定行 |
‘s’ | 查找并替换 |
练习:
文件准备
# vim a.txt root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 298374837483 172.16.0.254 10.1.1.1 |
打印操作
sed '' a.txt | 对文件不做任何操作,直接打印 |
sed 'p' a.txt | 文件中每行内容都被打印了两次 |
sed -n 'p' a.txt | 模式空间中的内容不会被打印 |
sed -n '2p' a.txt | 只打印第二行的内容 |
sed -n '1,5p' a.txt | 打印1到5行 |
sed -n '$p' a.txt | 打印最后一行 |
增加文件内容操作
i 指定位置上一行插入
a 指定位置下一行插入
sed '2ihelloworld' a.txt | 在第2行的上一行插入helloworld |
sed 'ihelloworld' a.txt | 在每一行的上一行插入helloworld |
sed '2ihello\nworld' a.txt | 在第2行的上一行插入两行内容 |
sed '2ihello\ > world' a.txt | |
sed '2ahelloworld' a.txt | 在第2行的下一行插入helloworld |
sed '2,4ahelloworld' a.txt | 在2到4的每一行插入helloworld |
sed 'ahelloworld' a.txt | 在每一行的下一行插入helloworld |
修改文件内容操作
c 替换指定的整行内容
sed '$chello world' a.txt | 把文件最后一行替换为hello world |
sed '2chello world' a.txt | 把文件第2行替换为hello world |
sed '/^bin/c hello' a.txt | 以bin开头的行替换为hello |
sed 'c hello' a.txt | 把每一行都替换为hello |
sed '1,5c hello' a.txt | 把1-5行的内容替换为一行hello |
删除文件内容
sed '4d' a.txt | 删除第4行 |
sed '1,4d' a.txt | 删除1-4行 |
sed '/[0-9]/d' a.txt | 删除带数字的行 |
sed -r '/([0-9]{1,3}\.){3}[0-9]/d' a.txt | 使用扩展正则删除ip |
sed '$d' a.txt | 删除最后一行 |
对文件进行搜索替换
语法:sed 选项 's/搜索的内容/替换的内容/动作' 需要处理的文件
其中,s表示search搜索;斜杠/表示分隔符,可以自己定义;动作一般是打印p和全局替换g。
sed -n 's/root/ROOT/pg' a.txt | 将文件中所有的root替换为ROOT |
sed -n 's/^#//gp' a.txt | 删除#号开头的行 |
sed -n 's#/bin/bash#ji xiang#pg' a.txt | 使用#号也可以作为分割符 |
sed -n '10s#/sbin/nologin#jili#p' a.txt | 指定行号进行替换 |
sed -n '1,5s/^/#/p' a.txt | 在1-5行的开头加#号 |
sed -n 's/\(10.1.1\).1/\1.254/gp' a.txt | 将10.1.1.1替换为10.1.1.254 |
sed的其他命令
sed '3r /etc/hosts' a.txt | 将/etc/hosts中的内容添加到文件的第3行之后 |
sed 'r /etc/hosts' a.txt | 将/etc/hosts中的内容添加到文件的每一行之后 |
sed '$r /etc/hosts' a.txt | 将/etc/hosts中的内容添加到文件的最后一行之后 |
sed '1,5w b.txt' a.txt | 把a.txt文件1-5行的内容保存到b.txt |
sed -n '1,5s/adm/&in/gp' a.txt | 在adm之后追加in,使用&表示匹配到的元素 |
sed -n '/sbin/=' a.txt | 打印出包含关键字的行号 |
sed -n '1,5!p' a.txt | 打印除了1-5以外的行 |
sed '/lp/q' a.txt | 匹配到lp就退出 |
sed的其他选项
-e 多项编辑
-r 扩展正则
-i 修改原文件,注意:-ni 不要一起使用,p命令 不要在使用-i时使用
sed -ne '1p' -ne '5p' a.txt | 打印第一行和打印第五行 |
sed -e '2d' -e '5ahello' a.txt | 删除第二行和在第5行后加hello |
sed -ne ‘2p;5p’ a.txt | 打印第二行和打印第五行 |
sed -e ‘/^#/d’ -e ‘/^$/d’ a.txt | 删除文件中的注释和空行 |
sed -e ‘/^#/d;/^$/d’ a.txt | 删除文件中的注释和空行 |
sed -r ‘/^#|^$/d’ a.txt | 删除文件中的注释和空行 |
sed -nr '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' a.txt grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}' 1.txt grep -o -E '([0-9]{1,3}\.){3}[0-9]{1,3}' 2.txt | 打印文件中的ip地址 |
sed -i 's/root/ROOT/g' 11.txt | 修改源文件中的root为ROOT |
sed结合正则使用
sed -n '/^bin/,/^lp/p' a.txt | 匹配以bin开头到lp开头的行 |
sed -n '/^bin/,/^lp/!p' a.txt | 匹配除了以bin开头到lp开头的其他行 |
sed -n '/^bin/,4p' a.txt | 匹配以bin开头到第4行 |
sed -rn '/^bin|^lp/p' a.txt | 匹配以bin和lp开头的行 |
sed脚本模式
用法:sed -f scripts.sh file
脚本的第一行写上 #!/bin/sed -f 1,5d s/root/hello/g 3i777 5i888 a999 p |
注意事项:
1) 脚本文件是一个sed的命令行清单。'commands'
2) 在每行的末尾不能有任何空格、制表符(tab)或其它文本。
3) 如果在一行中有多个命令,应该用分号分隔。
4) 不需要且不可用引号保护命令
5) #号开头的行为注释
举例说明:
数据准备:
vi 11.txt
stu3:x:509:512::/home/user3:/bin/bash stu4:x:510:513::/home/user4:/bin/bash stu5:x:511:514::/home/user5:/bin/bash |
编辑sed脚本:
vi 1.sed
#!/bin/sed -f 3a********************** $chelloworld 1,3s/^/#&/ |
执行:
sed -f 1.sed -i 11.txt
cat 11.txt
#stu3:x:509:512::/home/user3:/bin/bash
#stu4:x:510:513::/home/user4:/bin/bash
helloworld
**********************