流编辑器 sed 的介绍和使用,简单的来说,Sed一次处理一行内容。
目录
简介
简单的来说,Sed一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称之为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕,接着处理下一行,直到文件末尾。
文本文件—>sed的模式空间(缓冲器)——–>shell
sed 是一种在线的、非交互式的编辑器,它一次处理一行内容。
处理时,把当前处理的行存储在临时缓冲区中,称为模式空间
接着用sed命令处理缓冲区的内容,处理完后把缓冲区的内容送往屏幕。
接着处理下一行,这样不断重复,知道文件末尾,文件内容并没有改变,除非你使用重定向存储输出。
sed主要用来自动编辑一个或多个文件,简化对文件反复操作,编写转换程序等
sed -ri.bak sed -ric –follow-symlinks
命令格式
sed [options] command
file(s)
sed [options] -f scripfile file(s)
注意:sed和grep不一样,不管是否找到指定的模式,它的退出状态都是0
只有当命令存在语法错误时,sed的退出状态才是非0
支持正则表达式
与grep一样,sed在文件中查找模式时也可以使用正则表达式(re)及各种元字符,正则表达式是括在斜线间的模式,用于查找和替换
以下是sed支持的元字符
基本元字符:^,$,.,*,[],[^],<>,(),{}
使用扩展元字符:?,+,{},|,()
使用扩展元字符,有两种方法
+
sed -r
示例讲解
shell1.sh
sed '4,7' passwd #不修改源文件
sed -rn 'p' passwd #打印
sed -rn '/^root/' passwd #打印
sed -r 's/^root/alice/gi' passwd #查找替换,s是替换,gi忽略大小写,作用每一行,i真删除
sed -r '/^root/alice/d' passwd #从passwd查找删除,d假删除,只是打印删除
sed -r 's#/etc/root#/root/file#' passwd #从passwd查找替换,
sed扩展
地址(定址)
地址用于决定处理那些进行编辑,地址形式可以是数字,正则表达式,或者二者的结合
如果没有执行地址,sed奖处理输入人间中的所有行。
#!/user/bin/bash
sed -r 'd' /etc/passwd #删除所有
sed -r '3d' /etc/passwd #删除第三行
sed -r '1,3d' /etc/passwd #删除第1行到第三行
sed -r '/root/d' /etc/passwd #删除root行,或者转义 \#root#d,
sed -r '/root/,5d' /etc/passwd #删除root行开始到第三行
sed -r 's/root/alice/g' /etc/passwd #查找替换‘’ ,这里可以将斜线换成#号,@号
sed -r '/^adm/,+5d' /etc/passwd #查找adm开头行后,再删除5行
sed -r '/root/d' /etc/passwd #查找替换
sed -r '/root/!d' /etc/passwd #除了root行都删除
ed -r '1~2d' /etc/passwd #删除所有奇数行,从1开始,每隔两个删一个 odd
ed -r '0~2d' /etc/passwd #删除所有偶数行 从0开始,每隔两个删一个 even
命令
sed 命令告诉sed对执行的对象进行何种操作,保留打印,,删除,修改等
命令 功能
a 在当前行后添加一行或多行
c 用新文本修改或替换当前行中的文本
d 删除行
i 当前行之前插入文本
l 列出非打印字符
p 打印行
n 读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理
q 结束或退出sed
! 对所选行以外的所有行应用命令
S 用一个字符串替换另一个
g 在行内进行全局替换
i 胡烈大小写
r 从文件中读
w 将行写入文件
h 把模式空间里的内容复制到暂存缓冲区(覆盖)
H 把模式空间里的内容追加到暂存缓冲区
g 提取暂存缓冲区的内容,将其复制到模式空间,覆盖该处原有内容
G 提取暂存缓冲区的内容,将其复制到模式空间,追加在该出原有内容
x 交换暂存缓冲区与模式空间的内容
选项
选项 功能
-e 允许多项编辑
-f 指定sed脚本文件名
-n 取消默认的输出
-i inplace,就地编辑
-r 支持扩展元字符
sed命令示例
#!/usr/bin/bash
#打印命令
sed -r '/north/p' datafile
sed -rn '/north/p' datafile
#删除命令:d
sed -r '3d' datafile
sed -r '3{h;d}' datafile #同一行可能有多个命令,这里执行了两个命令
sed -r '3{d;}' datafile #同一行可能有多个命令,这里执行了1个命令,同下
sed -r '3{d}' datafile #同一行可能有多个命令,这里执行了1个命令,同下
sed -r '3,$d' datafile #删除3到最后一行
sed -r '$d' datafile #删除最后一行
sed -r '/north/d' datafile #删除包含north行
sed -r '/sourth/d' datafile #删除包含north行
#替换命令:s
sed -r 's/west/north/g' datafile #全局执行
sed -r 's/^west/north/' datafile
sed -r '1,5s/[0-9][0-9]$/&.5/' datafile #&代表在查找串中匹配到的内容,一到五行
# 读文件命令:r
sed -r '/suan/r etc/file' datafile
sed -r '2r /etc/hosts' a.txt
sed -r '/2/r /etc/hosts' a.txt
#写文件命令:w
sed -r '/north/w newfile' datafile #将datafile中的north行写到newfile中去
sed -r '3,$w /new1.txt' datafile
#追加命令:a
sed -r '2a\11111111' /etc/hosts
#i 在前面插入
#c:替换行
#获取下一行命令:n
sed -r '/eastern/{n:d}' datafile
sed -r '/eastern/{n:s/Am/archile}' datafile
#暂存和取用命令:h,H,g G
#这里涉及到模式空间和暂存空间
#
# 暂存空间 #本身会有个换行符,暂存空间里默认存储一个空行。
# ^ |
# h,覆盖 | | G 追加
# H,追加 | | g 覆盖
# | |
# | \/
#文本----------->-模式空间-------------->终端输出
#
#
sed -r '1h;$G' /etc/hosts #把第一行放到暂存空间里,然后在处理最后一行时,再在最后追加这一行
sed -r '1{h;d}' /etc/hosts #把第一行覆盖到暂存空间里,然后删除
sed -r '1h;2,$g' /etc/hosts #把第一行覆盖到暂存空间里,第二行,到最后一行都覆盖成第一行
sed -r '1h;2,3H;$G' /etc/hosts #把第一,二,三行覆盖到暂存空间里,到最后一行后再追加成第一,二,三行
#暂存空间和模式空间交换命令:x
sed -r '4h;5x;6G' /etc/hosts # 先把第四行放到暂存空间,然后在第五行与暂存空间的互换,然后在第六行时,追加暂存空间(第五行)在后面
# 反向选择:!
sed -r '3d' /etc/passwd
sed -r '!3d' /etc/passwd #除了第三行意外的都删除
# 多重编辑选项:e
sed -r -e '1,3d' -e 's/hem/jones/' /etc/passwd
sed -r -e '1,3d;s/hem/jones/' /etc/passwd
sed -r -e '2s/we/1000/g;2s/ad/da/g' /etc/passwd #/g的意思是把第二行所有找到的都换掉
sed -r -e '2{s/we/1000/g;s/ad/da/g}' /etc/passwd
sed常见操作
#hellp
#hellp
// hellp
删除配置文件中#号注释行
sed -ri '/^[\t]*#/d' file.config ,其中`*`表示0到多个元字符,这里是0到多个table键
#删除配置文件中//号注释行
sed -ri '\Y^[\t]*//Yd' file.config ,这里相当于 # /^[\t]*///d 其中两个/,换成#后 #^[\t]*//# ,再转义一下 \#^[\t]*//#d
#删除无内容空行
sed -ri '/^[\t]*$/d' file.config #这里加了i的话,相当于对源文件进行了操作
#为文件添加注释
sed -r '2,6s/^/#/' a.txt
sed -r '2.6s/(.*)/#\1/' a.txt
sed -r '2,6s/.*/#&/' a.txt
sed -r '3,$ s/^#*/#/' a.txt 将行首0个或者多个# 换成一个#
sed -r '30,50s/^[\t]*#*/#' a.config
sed -r '3,8s/^[\t#]*/#' a.config
#sed使用外部变量
外部变量 var=11111
sed -ri '3a$var' /etc/pw #这里是错的,最终添加了$var
#使用双引号
sed -ri "$a$var" /etc/pw #这里是错的,$a是错的,不是变量,二十最后一行添加
#个使个的,分开使用
sed -ri '$a'"$var" /etc/pw
#也可以使用
sed -ri $a$var /etc/pw
#或者
sed -ri "\$a$var" /etc/pw
#倒转
sed -r '1!G;$!h;$!d' a.txt #类似cat和tac
#a.txt原本是
#1
#2
#3
#4
#执行上述命令后变为
#4
#3
#2
#1
#思路:
#1!G可以简化为 [2,5]G
#$!h 可以理解为[1,4]h
#$!d 可以理解为[1,4]d
#类似于seq 3| sed '1!G;h;$!d'
#G将暂存空间的内容追加到模式空间
#h将模式空间的内容覆盖到暂存空间
#d删除模式空间中的所有行,并读入下一个新行到模式空间中
#所以当行数为1时,不执行1!G,执行h和$!d,此时模式空间是null,无输出到屏幕,暂存空间是1
#当执行到第二行时,读入2到模式空间,执行1!G,此时模式空间时2,1,暂存空间是1,,然后再把模式空间替换到暂存空间,则此时模式空间和暂存空间都是2,1,然后判断不是最后一行,则删除模式空间为null,无输出到屏幕,暂存空间为2,1
#当执行到第三行时,读入3到模式空间,执行1!G,再执行h,模式空间和暂存空间都为3,2,1,再执行$!d删除模式空间为null,无输出到屏幕,此时暂存空间为3,2,1
#当读到第四行时,将4独到模式空间后执行1!G,追加模式空间为4,3,2,1,然后执行$!h,此时不执行,再执行$!d,此时不执行,这是模式空间为4,3,2,1,输出到屏幕可见,暂存空间为3,2,1