sed 流编辑器
2022/4/18 6:14:32
本文主要是介绍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 流编辑器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-14动态路由项目实战:从入门到上手
- 2024-11-14函数组件项目实战:从入门到简单应用
- 2024-11-14获取参数项目实战:新手教程与案例分析
- 2024-11-14可视化开发项目实战:新手入门教程
- 2024-11-14可视化图表项目实战:从入门到实践
- 2024-11-14路由懒加载项目实战:新手入门教程
- 2024-11-14路由嵌套项目实战:新手入门教程
- 2024-11-14全栈低代码开发项目实战:新手入门指南
- 2024-11-14全栈项目实战:新手入门教程
- 2024-11-14useRequest教程:新手快速入门指南