ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

sed 流编辑器

2022-04-18 01:02:48  阅读:141  来源: 互联网

标签:匹配 text yaoguang 编辑器 sed txt root


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

标签:匹配,text,yaoguang,编辑器,sed,txt,root
来源: https://www.cnblogs.com/yaoguang0618/p/16158010.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有