sed 编辑文本
sed:文本流编辑,,不与文件打交道,它操作的只是一个拷贝,然后所有的改动如果没有重定向到一个文件,将输出到屏幕
是一种重要的文本过滤工具,使用一行命令或者使用管道与grep与awk相结合,非交互性文本流编辑
man sed; info sed
sed '范围s/老字符/新字符/标记' 文件
sed的命令格式: sed [选项] sed命令 输入文件
sed的脚本格式:sed [选项] -f sed脚本文件 输入文件
sed脚本文件 [选项] 输入文件
eg: //sed [选项] sed命令 输入文件
sed -e 's/root/tony/g' -e 's/bash/nologin/g' /etc/passwd //sed [选项] sed命令 输入文件
eg: //sed [选项] -f sed脚本文件 输入文件
vim sss //脚本的名字,添加下面两行
s/root/tony/g
s/bash/nologin/g
sed -f sss /etc/passwd //sed [选项] -f sed脚本文件 输入文
eg: //sed脚本文件 [选项] 输入文件
vim ss //脚本的名字,脚本为sed的脚本,添加这两
#!/bin/sed -f
s/root/tony/g
s/bash/nologin/g
chmod +x ss //加权限
./ss /etc/passwd //sed脚本文件 [选项] 输入文件
sed的命令选项:-n 不打印所有行到标准输出 ,-c下一个命令式编辑命令 , -f 正在调用sed脚本文件
-e只会显示给你看你修改的,但是不会对源文件进行操作
-i不会显示给你看你修改的,直接对源文件已经操作了(-i与i\是有差别的)
sed在文件中查询文本的方式:
使用行号,可以是一个简单数字,或是一个行号范围
使用正则表达式
x x为行号
x,y 表示行号从x到y
/pattern 查询包含模式的行
/pattern /pattern 查询包含两个模式的行
pattern/,x 在给定行号上查询包含模式的行
x,/pattern/ 通过行号和模式查询匹配的行
x,y! 查询不包含指定行号x和y的行
基本sed编辑命令:
p 打印匹配行(和-n选项一起合用)
= 显示文件行号
a\ 在定位行号后附加新文本信息
i\ 在定位行号后插入新文本信息
d 删除定位行
c\ 用新文本替换定位文本
s 使用替换模式替换相应模式
r 从另一个文本中读文本
w 写文本到一个文件
q 第一个模式匹配完成后推出或立即退出(不用和-n选项一起合用)
l 显示与八进制ACSII代码等价的控制符
{} 在定位行执行的命令组,用分号隔开
n 从另一个文件中读文本下一行,并从下一条命令而不是第一条命令开始对其的处理
g 将模式2粘贴到/pattern n/
y 传送字符,替换单个字符
sed默认打印全部行,sed -n默认不打印其他行,只打印与之相关的行
sed实现打印:用到的参数 -n和p一般结合用 还有=
eg:
sed '2p' score.txt 打印第二行,其它的行也会打印,第二行会显示两遍
sed -n '2p' score.txt 打印第二行
sed -n '1,4p' score.txt 打印第一行到第四行
sed -n '/los/p' myfile.txt 打印包含los字符的那行 awk '$0 ~/los/' myfile.txt
sed -n '/\<los\>/p' myfile.txt 打印匹配有los这个单词的行
sed -n '/root/,4p' /etc/passwd 打印从root行到第4行的内容
sed -n '3,7!p' passwd 打印匹配不在3-7行之间的
sed -n '2,5!{=;p}' filename 打印匹配不在2-5之间的行和行号,先显示行号在显示行号的内容
sed -n '/^$/p' filename | wc -l 打印匹配空格的行,然后统计有多少行
sed -n '/^$/{=;p}' filename 打印显示哪行是空格 ----> sed -n -e '/^$/p' -e '/^$/=' filename
sed -n '/^$/=' file 打印空行的行数 -----> awk '{if($0~/^$/) print NR}' file --->
grep -n '^$' file(会在行号后面加:) grep -n '^$' file | awk -F: '{print $1}' (去掉了:)
sed -n '4,/los/p' myfile.txt 打印第四行到los行中间的,包括los行
sed '5 q' passwd 打印前5行(q参数只能从1到那个数字的行)
sed -n '/r*t/p' /etc/passwd 打印匹配r有0个或者多个(也可以理解含有t字母的行) //*表示匹配前面的字符有任意个
sed -n '/.r.*/p' passwd 打印匹配有r的行并且r后面跟任意字符
sed -n '/o*/p' passwd 打印o字符重复任意次
sed -n '/o\{1,\}/p' passwd 打印o字重复出现一次以上
sed -n '/o\{1,3\}/p' passwd 打印o字重复出现一次到三次之间以上
sed实现添加:(对源文件添加的话就用-i参数)用到的参数 a\ or i\
eg:
sed -i '/jie/a\tom' myfile.txt 在含有jie的哪行的下面添加tom这行 or sed -i '/jie/a tom' myfile.txt
sed -i '/root/a\how are you\nand you' passwd 添加多行用\n来转行
sed -i '/jie/i\tom1' myfile.txt 在含有jie的哪行的上面添加tom1这行
sed -i 's/root/man &/p' passwd 在root的前面添加man这个字符(后面接p参数则添加了两行,不接p则只有一行)
sed -i '1i\abc' li 在文件首行添加一行 or 用awk 'BEGIN{print "abc"}{print $0}' li
sed -i '$a nihao' li 在li文件末尾行在追加一行,在往下面继续追加多行可以用\n来换行 echo "nihao" >> li
or awk '{print $0} END{print "bbb"}' 1
sed -i 's/^/nihao /g' 1 在文件的每一行开头都加上nihao字符
sed -i 's/$/tail /g' 1 在文件的每一行行尾都加上tail字符
sed -i -e 's/adm/OU/' -e '/OU/ a we find OU' passwd //把asd改成OU并在OU的行追加 we find OU
sed实现删除(过滤):用到的参数 d (不加-i参数一般适合查看)
eg:
sed -n '/\#/!p' /etc/vsftpd/vsftpd.conf 打印出以#开头的行,然后用!进行反选 ,\#是转义字符,则表示过滤掉以#开头的行
sed -n '/^#/!{/^$/!p}' /etc/vsftpd/vsftpd.conf 过滤掉以#开头的行和空格的行
sed -e '/^#/d' -e '/^$/d' /etc/vsftpd/vsftpd.conf 过滤掉以#开头的行和空格的行
sed -e '/bash/d' /etc/passwd 删除匹配字符bash的行
sed -e '/\<los\>/d' filename 删除匹配单词los的行
sed -e '1,4d' score.txt 删除第一行到第四行
sed -e '1d' file 删除首行
sed -e '$d' file 删除尾行
sed -i -n '/\#/!p' 1 删除源文件以#开头的行
sed -i 's/#//g' 表示把#换成空白(也可理解删除#号) 这种适合把一行里面的删除你不需要的信息
sed实现改写(替换):用到的参数 s和g连用 y c\ w n
eg:
sed -i '/jie/c\tom123' myfile.txt 把含有jie的哪行替换成tom123这行sed -n '/jie/ctom123' myfile.txt (两句都是一样)
sed -i 's/root/tony/g' /etc/passwd 替换
sed -i 's/root/tom/2p' passwd 替换root在这行第二次出现的
sed -i '/bash/s/root/tony/' /etc/passwd 默认换掉第一root字符 bash是匹配的条件
sed -i '/bash/s/root/tony/2' /etc/passwd 换掉root出现在的第二次的字符
sed -i '/bash/s/root/tony/g' /etc/passwd 替换这行所有的root
sed -i '/root/{s/bash/nologin/g;s/0/23/g}' passwd 在匹配root字符的行里面把bash替换nologin,0替换成23
sed -i '/root/{n;s/bin/tom/g}' passwd 用n参数在匹配root字符的后面一行里面的bin替换成tom
sed -i 'y/abc/xyz/' aa 把aa文件中的第一个字符有包括abc的换成xyz,a换成x,b换成y,c换成z
sed -i 's/root/va/w passwd1' passwd 把root换成va然后写到passwd1文件里面
sed -i 's/root/(&)/pg' passwd ---->(root):x:0:0:(root):/(root):/bin/bash
sed实现查找(匹配的查找):
eg:
用grep,sed,awk匹配某个字符出现的次数
grep 'o*' passwd --color or sed -n '/o*/p' passwd //o字符重复任意次 or awk '$0~/o.*/ {print $0}' passwd
grep 'o\{1,\}' passwd --color or sed -n '/o\{1,\}/p' passwd //o字重复出现一次以上
or awk --posix 'BEGIN{FS=":"}$0~/o{1,}/{print $0}' passwd
grep 'o\{2,\}' passwd --color or sed -n '/o\{2,\}/p' passwd //o字重复出现2次以上
or awk --posix 'BEGIN{FS=":"}$0~/o{2,}/{print $0}' passwd //(要用--posix参数或者--re-interval参数)
用sed和awk不区分大小写的查询字符
sed -n '/[aA][dD][mM]/p' passwd or awk 'BEGIN{FS=":"}/[aA][dD][mM]/{print $0}' passwd (BEGIN{FS=":"}可以不要)
sed其他经典的例子:
sed '$!N;s/\n/ /g' 1 将一个文本的奇数行和偶数行合并
sed -n -e 2p -e 3p 1|sed '$!N;s/\n/ /' 第2 行和第3 行合并
eg:
[iyunv@Centos ~]# cat 3
add
nis
jiushi
wo yun
this is
[iyunv@Centos ~]# cat 2.sh
#!/bin/bash
m=`cat 3| grep "this"`
sed -i "/$m/d" 3
[iyunv@Centos ~]# cat 3 | grep "wo" | sh 2.sh //用管道把过滤的内容在用管道去执行
[iyunv@Centos ~]# cat 3
add
nis
jiushi
wo yun
[iyunv@Centos ~]# cat 2.sh
#!/bin/bash
m=`cat 3| grep "this"`
sed -i "/$m/d" 3