Linux学习笔记(八)
sed
sed是一种功能强大的流式文本编辑器,能够完美结合正则表达式使用。处理时sed将当前处理的行储存在临时缓冲区中,称为模式空间(pattern space),接着sed命令处理缓冲区的内容,处理完成后打印到屏幕,接着继续处理下一行,不断重复直到文件结束。
sed的用途
sed用途十分广泛:
- 文本替换
- 选择性的文件输出
- 从文本特定位置进行编辑
- 无交互式的文本编辑
工作流
sed遵循简单的工作流:读取、执行以及显示,下图显示sed的工作流程:
- 读取:sed从输入流(文件、管道、标准输入STDIN等)中读取一行并且存储到模式空间的内部缓冲区
- 执行:默认情况下所有的sed命令都在模式空间中按顺序执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行
- 显示:发送修改后的内容到输出流,之后模式空间将被清空,继续重复上述过程直到文件结束
注意事项
- 模式空间(pattern space)是一块活跃的缓冲区,在sed编辑器执行命令时它会保存待检查的文本
- 默认情况下所有的sed命令都是在模式空间中执行,因此输入文件不会发生改变
- 另外一个缓冲区是保持空间(hold buffer),在处理模式空间中的某些行时,可以利用保持空间来临时保存一些行,在每一个循环结束的时候,sed将会移除模式空间的内容,但是保持空间的内容在所有循环过程中是持久存储的,sed命令无法直接在保持空间中执行,因此sed允许数据在模式空间与保持空间之间切换
- 初始情况下模式空间和保持空间都是空的
- 如果没有提供输入文件的话sed将会从标准输入接收请求
- 如果没有提供地址范围的话,默认情况下sed将对所有的行进行操作
sed的选型、命令、替换标记
sed作为一个强大的流式编辑器,具有其特有的格式
sed命令格式
sed [options] 'commands' file(s)
sed [options] -f scriptfile file(s)
选项
- -e:以选项中指定的script来处理输入的文本文件
- -f:以选项中指定的script文本来处理输入的文本文件
- -n或者–quiet或者–silent:仅显示script处理后的结果
sed命令
- a\:在当前行下面插入文本
- i\:在当前行上面插入文本
- c\:将选定的行改为新的版本
- d:删除选择的行
- D:删除模板块的第一行
- s:替换指定字符
- h:拷贝模板块中的内容到内存中的缓冲区
- H:追加模板块中的内容到内存中的缓冲区
- g:获取缓冲区的内容并替代当前模板块的内容
- G:获取缓存区的内容,并追加到当前模板块文本后面
- l:列出不能打印字符的清单
- n:读取下一个输入行,并用下一个命令处理新的行而不是用第一个命令
- N:追加下一个输入行到模板块后面并在两者间嵌入一个新行,改变当前行号码
- p:打印模板块的行
- P:打印模板块的第一行
- q:退出sed
- b label:分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾
- r file:从file中读取行
- t table:if分支,从最后一行开始,条件一旦满足或者T、t命令,将导致分支到带有标号的命令处或者到脚本的末尾
- T table:错误分支,从最后一行开始,一旦发生错误或者T、t命令,将导致分支到带有标号的命令处或者到脚本的末尾
- w file:写并追加到file末尾
- W file:写并追加模板块的第一行到file末尾
- !:表示后面的命令对所有没有被选定的行发生作用
- =:打印当前行号码
sed替换标记
- g:表示行内全面替换
- p:表示打印行
- w:表示将行写入一个文件
- x:表示互换模板块中的文本和缓冲区的文本
- y:表示将一个字符翻译为另外的字符(不用于正则表达式)
- \l:子串匹配标记
- &:已匹配字符串标记
sed元字符集(就是一些正则表达式)
- ^:匹配行的开始,如/^sed/匹配所有以sed开头的行
- $:匹配行结束,如/sed$/匹配所有以sed结尾的行
- .:匹配一个非换行符的任意字符,如/s.d/匹配在sd之间接一个任意字符
- *:匹配0个或多个字符,如/*sed/匹配所有模板是一个或多个字符后接sed的行
- []:匹配一个指定范围内的字符,如/[sH]ed/匹配sed和Hed
- [^]:匹配一个不在指定范围内的字符,如/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字符开头紧跟sed的行
- \(..\):匹配子串,保存匹配的字符,如s/(love)able/\1rs,loveabel被替换成了lovers
- &:保存搜索字符用来替换其它字符,如s/love/**&**/,love替换成了**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的行
后面将讲解sed实例进行解释各个选项及其使用。