sed的简单介绍
sed起源于行编辑器ed,sed用于专门执行脚本的,sed不可以交互使用,
sed是面向字符流的(区别于屏幕编辑器,vi,vim ,nano等)
屏幕编辑器直接将文件读入内存,或文件的一部分读入内存,但是当文件体积过大时,可能造成内存不足等情况
面向字符流的编辑器,每次默认读取一行,输入流通过程序处理并输出到标准输出,输入可以来自文件 也可以来自标准输入,输出默认是标准输出,sed通过解释脚本工作,脚本定义了要执行的工作, ,默认情况下到sed的所有匹配的输入都会经过相应的处理,并转化为标准输出,但输入文件不发生变化
执行过程
每次读取一行,将读取的内容放入内存中的特定空间中(即:模式空间).
然后并检测当前行是否符合匹配条件(或多条匹配条件中的某些条条件),
如果符合执行条件则执行命令中的当前命令,然后继续后续检测,
如果不符合条件则跳过本条条件及命令,进行后续检测
所有的条件匹配完成后,sed输出模式空间中的内容.继续读取下一行,直到文件无法读取(即文件结束) sed的内存空间可以分为,模式空间和保持空间,(a,i,d,c,s,p等)命令可对模式空间的文本内容进行修改操作,(h,g,x,n)命令对模式空间与爆出空间的内容进行整体移动操作(及移动,覆盖,追加)
语法:
sed 选项 范围 命令 file
注:命令行的所有命令都会由shell优先解释后在传入sed命令中,在不需要shell做转换时,指定范围命令时尽可能使用单引号,
选项
-n 关闭默认输出
-e 多条语句同时执行
-f 从文件中读取命令
-r 支持能扩展的正则表达式
-i.bak 备份源文件为.bak后缀,将更改生效到文件
范围 格式 匹配条件1,匹配条件2
从匹配条件1的行开始[ ; 至匹配条件2的行结束] ([]表示闭区间)
范围为空将匹配全部行 (所以条件只是为了约束 匹配范围).
只存在一个匹配条件时,则表示符合该条件的行
匹配条件的几种表示方法
数字行号 , 到 10 , 25 从10 到 25
正则匹配 / / 匹配 关键字 / / ,/ /
第一开始到第二结尾,第一个关键字类似于开启,后面的都会执行命令 直到第二个匹配条件出现,匹配结束,
若无第二个匹配条件出现,则将一直执行到程序结束
$ 最后一行
+增量 1,+20 表示1到21 行
~步长 1~2 1 3 5
每次范围匹配结束后如果文件未读取完成则再次执行范围匹配
命令
命令
多条命令之间可以使用 ; 进行分割
如 sed 'p;d' sed '1~2p;1~2d'
c替换行
格式:sed "3,6c\ =====" 替换3-6行为指定行(替换后3-6行为1行)
w保存:
格式 sed "3,6w ww" 保存3-6行的内容至ww文件没有文件则创建 (当前目录下)
r读文件:
格式 sed "3,6r /dev/issue" 读取文件内容,追加到匹配的行后,每一行后面都会被追加完整的(读入的文件)文件内容
d删除匹配到的行:
格式 sed "3,6d" 删除3到6行的内容
p打印
格式 sed "3,6p" 打印3到6行的内容,
注:若要只打印3,6行,使用 -n 取消默认dayin
s 替换匹配文本
格式: sed '3,6s/passwd//g(标签)
标签: g全局 p打印 w保存
将文件3到6行中的passwd替换为空.g表示是全局替换(但是只读入了一行,一行的全局)
a在行后追加文本 ( 追加内容都可以使用转义字符 如 \n \t)
格式: sed "3,6a ==="在3-6 行后分别增加 ===
sed "3,6a\ ===="等价
a\声明后面是增加的字符串,所以可以有空格(会被认为空格也是需要增加的内容)
i在行前增加文本
格式: 同上
= 打印匹配行的行号
格式: sed "3,6=" 打印3-6行的行号
! 对前面匹配的行的结果取反
(即匹配的行取反为不匹配的,不匹配的取反为匹配的)
格式: sed "3,6!p" 取反3-6行(即就不匹配3-6行,这是最终结果,现
n 读取当前行的下一行覆盖模式空间
N 读取当前行的下一行追加模式空间
h 将模式空间中的内容覆盖至保持空间
H 将模式空间中的内容追加至保持空间
g 将保持空间的内容覆盖至模式空间
G 将保持空间的内容追加至模式空间
x 将模式空间的内容与保持空间进行互换
D:删除当前模式空间开端至\n的内容(即第一行),然后进行判断,模式空间是否为空,不为空则,则放弃之后的命令,执行D之前的命令(相当于进入循环体,模式空间为空时循环退出),如果为空,则(截断重新执行也好,执行后续命令也好,模式空间都删空了,后续命令范围无法匹配),则继续读取下一行(计数器,指针什么的为标准)重新执行(处理新的一行,不是重新处理文本).