流编辑器 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支持的元字符

基本元字符:^,$,.,*,[],[^],<>,(),{}

使用扩展元字符:?,+,{},|,()

使用扩展元字符,有两种方法

  1. +

  2. 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