文本处理sed
sed(Stream EDitor, 行编辑器):处理文本的工具。sed是一种流编辑器,它一次处理一行内容。把当前处理的行存储在临时缓冲区中,该缓冲区称为“模式空间”(pattern space ),接着用sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送到标准输出。然后紧接着处理下一行,这样不断重复,直到文件末尾。sed处理的过程中,对象文件中的内容并没有改变,除非使用重定向来存储处理后的结果。Sed 主要用来自动编辑一个或多个文件, 简化对文件的反复操作过程
sed的语法结构:
sed [OPTION]...{script} [input-file]...[actions]
常用选项:
-r : 支持使用扩展正则表达式
-n : 不输出模式空间内容到屏幕,即不自动打印(静默模式)
-e : 多点编辑(-e script1 -e script2 -e script3 指定多脚本运行)
-f : / PATH/SCRIPT_FILE : 从指定文件中读取编辑脚本
-i : 直接修改源文件;例如:sed -i '99d' f1 (危险,谨慎操作)
-i.bak : 备份;例如:对f1文件删除奇数行之前会自动对f1备份为f1.bak然后再对
f1这个源文件进行操作,命令如下:
sed -i.bak '1~2d' f1
sed的地址定界:
(1) 不给地址:对全文进行处理
例如:sed 'p' passwd : 对passwd文件每行分别在屏幕上打印两次
(2) 单地址:
# :#表示数字,指定的行;
例如:sed '1p' passwd : 第一行打印两次其它行打印一次
sed -n '1p' : 只打印第一行一次
$ :最后一行;
/regexp/ :任何能够被regexp所匹配到的行;
例如:打印以r开头的行:
法1:sed -n '/^r/p' passwd
法2:grep '^r' passwd
(3) 地址范围:
#,/regexp/ : 从 # 行开始,到第一次被 /regexp/ 所匹配到的行结束,中间的所有行;
例如: sed -n '3,/^s/p' passwd
#,# :从第 # 行到第 # 行;
例如: sed -n '3,6p' passwd
#,+n :从第 # 行开始,一直到向下的 n 行;
例如:sed -n '3,+3p' passwd
/regexp1/,/regexp2/ : 从第一次被/regexp1/匹配到的行开始,到第一次被/regexp2/匹配到
的行结束;
例如:匹配以r开头以b开头中间的行:
sed -n '/^r/,/^b/p' passwd
(4) first~step:first:起始行;step:步长
例如:
1、取100个数,起始位置为0,步长为100:seq 1000|sed -n '0~100p'
2、奇数行: seq 1000|sed -n '1~2p'
3、偶数行: seq 1000|sed -n '2~2p'
sed的编辑命令:
d : 删除模式空间匹配到的行;
例如:cat -n passwd|sed '60d'
p : 打印模式空间中匹配到的内容
a [\]text :在指定行后面追加文本;支持使用\n 实现多行追加
例如:在f1文件中的第99行的后面追加“new line” :
sed '99a\new line ' f1
例如:在f1文件中的80-99行的后面分别追加“new line” :
sed '80,99a\new line ' f1
例如:在f1文件中的第99行后面添加“new line1,new line2,new line3”
sed '99a\new line1\nnew line2\nnew line3' f1
i [\]text :在行前面插入文本
例如:在f1文件中的第99行的前面追加“new line” :
sed '99i\new line ' f1
例如:在f1文件中的80-99行的前面分别追加“new line” :
sed '80,99i\new line ' f1
例如:在f1文件中的第99行前面添加“new line1,new line2,new line3”
sed '99i\new line1\nnew line2\nnew line3' f1
c [\]text :用text替换匹配到的行;
例如:用“cxj”替换f1文件第98行的内容:
sed '98c\cxj' f1
w /path/somefile: 把指定的内容另存至/path/somefile路径所指定的文件中
例如:把f1文件中的90-99行另存为f3文件中:
sed '90,99w /root/app/f3' f1
r /path/somefile :在文件的指定位置插入另一个文件的所有内容,完成文件合并;
例如:把/etc/issue中的内容追加到f1文件中90行的后面:
sed '90r /etc/issue' f1
s/regexp/replacement/ : 搜索替代替换由regexp所匹配到的内容为replacement;支持
使用其他分隔符如s@@@,s###;条件是该分隔符在后面的模式中没有出现过),对于替换
还有两个后选项 g 和 i ,分别表示如下:
g : 全局替换
例如:sed -n 's/root/RooT/gp' f4
i : 不区分大小写
例如:将f4文件中的所有root替换为ROOT:
sed 's/root/ROOT/' f4
= : 为模式空间中的行打印行号;
例如:为“ passwd ”这个文件加行号:
sed '=' passwd
! : 模式空间中匹配行取反处理;
例如:处了第10行不打印其它都打印:
cat -n passwd | sed -n '10!p'
sed 示例:
sed ‘2p’ /etc/passwd
sed –n ‘2p’ /etc/passwd
sed –n ‘1,4p’ /etc/passwd
sed –n ‘/root/p’ /etc/passwd
sed –n ‘2,/root/p’ /etc/passwd
sed -n ‘/^$/=’ file 显示空行行号
sed –n –e ‘/^$/p’ –e ‘/^$/=’ file
sed ‘/root/a\superman’ /etc/passwd 行后
sed ‘/root/i\superman’ /etc/passwd 行前
sed ‘/root/c\superman’ /etc/passwd 代替行
sed ‘/^$/d’ file
sed ‘1,10d’ file
nl /etc/passwd | sed ‘2,5d’
nl /etc/passwd | sed ‘2a tea’
sed 's/test/mytest/g' example
sed –n ‘s/root/&superman/p’ /etc/passwd 单词后
sed –n ‘s/root/superman&/p’ /etc/passwd 单词前
sed -e ‘s/dog/cat/’ -e ‘s/hi/lo/’ pets
sed –i.bak ‘s/dog/cat/g’ pets
高级编辑命令:
sed工作机制是每次读取一行文本至“ 模式空间”中,在模式空间中完成处理,将处理结果
输出至标准输出设备;在模式空间中处理一行内容后会继续处理下一行,那么对于处理
过的行可能还有其它的处理,因此可以先把处理过的行“传送”至保持空间中,然后在后续
的处理过中再次“传送”回模式空间,这就类似加工车间及仓库的概念,好比模式空间是加
工车间,保持空间就是仓库,不过这里的仓库存储的都是些半成品的产品
h : 用模式空间中的内容覆盖保持空间中的内容
H : 把模式空间中的内容追加至保持空间中内容的后面
g : 从保持空间取出数据并覆盖模式空间中的内容
G : 从保持空间取出内容并将其追加至模式空间内容的后面
x : 把模式空间中的内容与保持空间中的内容进行互换
n : 读取匹配到的行的下一行至模式空间,并覆盖模式空间原有的内容
N : 读取匹配到的行的下一行至模式空间,并将其追加至模式空间原有内容的后面
d : 删除模式空间中的内容
D : 删除当前模式空间开端至\n 的内容( 不再传至标准输出),放弃之后的命令,
但是对剩余模式空间重新执行sed
sed 高级编辑命令示例:
1、 sed -n 'n;p' FILE
例子:下面这条命令首先是把1读到模式空间里面然后又因为有了‘ n ’这个命令就会读取1所在这一行的下一行也就是2,然后用2去覆盖模式空间中的1;由于sed自带循环所以会把所有的偶数行全部输出来
![](https://img.haomeiwen.com/i6144185/d7e44178540ff899.png)
2、sed '1!G;h;$!d' FILE
例子:倒序输出
3.png](https://img.haomeiwen.com/i6144185/34d7503d63142dc8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
3、sed 'N;D‘ FILE
例子:执行过程:首先把f2文件中第一行取出来放到模式空间,因为N所以会去下一行也就是第二行,接着D命令出现就会把模式空间中的首行删掉
![](https://img.haomeiwen.com/i6144185/4aadc132d7adfb20.png)
4、sed '$!N;$!D' FILE :只保留最后两行
5、sed '$!d' FILE :取最后一行
6、sed ‘G’ FILE :把原有文件中的每一行之间输入一个空行
7、sed 'g' FILE :把原有的行全部用空行代替
8、sed '/^$/d;G' FILE:把源文件所有的空行删除之后又在此基础上在每行之间加入空行
9、sed 'n;d' FILE
例子:下面这条命令首先把文件f1的第一行取出来放到模式空间,然后又因为有‘ n ’这条命令,所以会读取f1文件里面第一行的下一行,也就是第2行,而读取回来的第2行就会覆盖原来模式空间的内容覆盖掉,这条命令就是把偶数行全部删掉保留奇数行(因为sed自带自动打印所以奇数行得以保留)
![](https://img.haomeiwen.com/i6144185/ece178c7ff85f579.png)
10、sed -n '1!G;h;$p' FILE:倒序输出
网友评论