Linux学习笔记(八)

mark

sed

sed是一种功能强大的流式文本编辑器,能够完美结合正则表达式使用。处理时sed将当前处理的行储存在临时缓冲区中,称为模式空间(pattern space),接着sed命令处理缓冲区的内容,处理完成后打印到屏幕,接着继续处理下一行,不断重复直到文件结束。

sed的用途

sed用途十分广泛:

  • 文本替换
  • 选择性的文件输出
  • 从文本特定位置进行编辑
  • 无交互式的文本编辑

工作流

sed遵循简单的工作流:读取、执行以及显示,下图显示sed的工作流程: mark

  • 读取: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实例进行解释各个选项及其使用。

Researcher

I am a PhD student of Crop Genetics and Breeding at the Zhejiang University Crop Science Lab. My research interests covers a range of issues:Population Genetics Evolution and Ecotype Divergence Analysis of Oilseed Rape, Genome-wide Association Study (GWAS) of Agronomic Traits.

comments powered by Disqus