Java教程

sed 流编辑器

本文主要是介绍sed 流编辑器,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1.简介

sed全名叫stream editor,流编辑器,用程序的方式编辑文本,与vim的交互式编辑截然不同。
在sed命令处理数据之前,需要预先提供一组规则,sed命令会按照这个规则来编辑数据。

2.使用场景

  • 自动化程序中,不适合交互方式编辑的;

  • 大批量重复性的编辑需求;

  • 编辑命令太过复杂,在交互文本编辑器难以输入的情况;

3.工作原理

sed作为一款非交互式编辑器,它使用预先设计好的编辑指令对输入的文本进行编辑,完成之后输出编辑结果。

原理

  • sed从输入文件中读取内容,每次处理一行内容,并把当前的一行内容储存在临时的缓冲区,称为“模式空间”。
  • sed命令处理缓存区中的内容;
  • 处理完毕后把缓存区的内容输出到屏幕;
  • 接着处理下一行;
  • 这样不断重复,直到文件末尾,文件内容并没有发生改变,除非你使用了重定向输出或制定了i的参数。

4.sed语法格式

sed的命令模式:sed [选项] 地址范围 动作 file1 file2 .....
sed的脚本格式:sed [选项] -f scriptfile file(s)

选项

 -e :直接在命令行模式上进行sed动作编辑,此为默认选项;

 -f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作;

 -i :直接修改文件内容;

 -n :只打印模式匹配的行;

 -r :支持扩展表达式;

 -h或--help:显示帮助;

 -V或--version:显示版本信息。

sed常用命令

 a \内容 	在当前行下面插入文本;

 i \内容 	在当前行上面插入文本;

 c \内容 	把选定的行改为新的文本;

 d 	删除,删除选择的行;

 D 	删除模板块的第一行;

 s 	替换指定字符;

 h 	拷贝模板块的内容到内存中的缓冲区;

 H 	追加模板块的内容到内存中的缓冲区;

 g 	获得内存缓冲区的内容,并替代当前模板块中的文本;

 G 	获得内存缓冲区的内容,并追加到当前模板块文本的后面;

 l 	列表不能打印字符的清单;

 n 	读取下一个输入行,用下一个命令处理新的行而不是用第一个命令;

 N 	追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码;

 p 	打印模板块的行。 P(大写) 打印模板块的第一行;

 q 	退出Sed;

 b lable 	分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾;

 r file 	从file中读行;并将file中的内容添加到符合条件的行处

 W file 	写并追加模板块的第一行到file末尾;

 ! 	表示后面的命令对所有没有被选定的行发生作用;

 = 	打印当前行号;

 # 	把注释扩展到下一个换行符以前;

sed替换标记

 g 表示行内全面替换;

 p 表示打印行;

 w 表示把行写入一个文件;

 x 表示互换模板块中的文本和缓冲区中的文本;

 y 表示把一个字符翻译为另外的字符(但是不用于正则表达式);
 
 \1 子串匹配标记;

 & 已匹配字符串标记;

sed元字符集

^ 匹配行开始,如:/^sed/匹配所有以sed开头的行;
 
 $ 匹配行结束,如:/sed$/匹配所有以sed结尾的行;
 
 . 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d;
 
 * 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行;
  
 [] 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed;
   
 [^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行;
  
 \(..\) 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers;
  
 & 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**;
  
 \< 匹配单词的开始,如:/\ 
 \> 匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行;
 
 x\{m\} 重复字符x,m次,如:/0\{5\}/匹配包含5个0的行;
 
 x\{m,\} 重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行;
 
 x\{m,n\} 重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行;

实例

实例1 删除行-d

[root@yaoguang ~]# sed '1,2'd text.txt  #删除第一行到第二行
33
44
55
66


[root@yaoguang ~]# cat text.txt 
11
22
33
44
55
66
[root@yaoguang ~]# sed '3,$'d text.txt  #删除第三行到最后一行
11
22
[root@yaoguang ~]# sed '/^1'/d text.txt   #删除以1开头的行
22
33
44
55
66

实例2 打印输出-p

[root@yaoguang ~]# sed -n '3p' text.txt 
33
[root@yaoguang ~]# sed -n '/^4/p' text.txt 
44

实例3 行下面插入内容-a

[root@yaoguang ~]# sed '/^3/a \#zhe shi cha ru de nei nei rong' text.txt  #在以3开头的行下面插入
11
22
33
#zhe shi cha ru de nei nei rong
44
55
66
[root@yaoguang ~]# sed '4a \#zhe shi cha ru de nei nei rong' text.txt   #在第四行下面按插入
11
22
33
44
#zhe shi cha ru de nei nei rong
55
66

实例4 从file中读行;并将file中的内容添加到符合条件的行处

[root@yaoguang ~]# sed '2r /etc/fstab' text.txt   #/etc/fstab里的内容被读进来,显示在与2匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面
11
22

#
# /etc/fstab
# Created by anaconda on Mon Feb 14 00:44:55 2022
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
UUID=61c45d45-61a2-40d7-b27e-31e4050c1ff8 /                       ext4    defaults    
    1 133
44
55
66

实例5 将fstab文件里面包含UUID的行写入到text.txt文件里面(覆盖text.txt文件里面的原内容)

[root@yaoguang ~]# sed '/UUID/w text.txt' fstab 
[root@yaoguang ~]# cat text.txt 
UUID=61c45d45-61a2-40d7-b27e-31e4050c1ff8 /                       ext4    defaults    
    1 1

实例6 替换

[root@yaoguang ~]# sed 's/11/00/' text.txt  #第一种方式
00
22
33
44
55
[root@yaoguang ~]# sed '1 c 99' text.txt   #第二种方式
99
22
33
44
55

[root@yaoguang ~]# cat text.txt
11
22
33
44
55
这篇关于sed 流编辑器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!