sed:stream editor,Linux的一款流编辑器,主要对文本内容进行过滤与替换。使用命令man sed,可以看到对sed命令的介绍
下文总体指导思想:
对于sed的工作过程,个人认为如果不是非要把sed的所有功能都学会,是不需要把工作过程搞懂的。绝大部分人,特别针对于想要先尽快上手的人,掌握如何使用基本的sed功能应该比较重要的!
学习sed命令的使用,主要还是结合man sed中的提示来学习:
sed synopsis(大纲):命令的格式
- sed 【option】【script】【input_file】
sed使用的学问就是在上面三个标记颜色的区域,下面简述这三个区域:
【option】域:作用主要是指定sed处理完数据后应该怎么呈现结果(可能描述不是很恰当),比如结果怎么显示,要不要对文本本身修改等。
空:当不指定参数时,sed为将处理的文本内容原样输出,即不过做什么操作,文件的文本内容都先显示
-n: (silent,也称为静默模式)取消默认输出,即与上面相反。只将进行过相应处理的行打印输出,没有匹配到的行不原样输出。
-i:sed直接操作文本内容,对其的任何内容修改都会更改文件。(sed默认不是对文件的文本内容进行操作,而是拷贝其内容到自己的工作空间中在进行操作 )
【script】域:该域的作用是指定对某哪些行做某哪些操作!
该域其实是分为两个部分:指定行+操作(address+command),前者可以少但后者不能少!
- 怎么表现要处理的行:address
- 要进行哪些操作:command
如何表示行呢?有以下选项:(90%的主要写法,个别较少使用不适合入门理解未写上)
- number:直接指定一个数字,如5,即操作的行对象是第5行
- first~step:直接上例子(3~4),指的是从第三行开始匹配,之后每隔4行就被匹配到。因此,第3,7,11,...行将是被操作的行。first指要匹配的第一行,step指从第first行之后,每隔step行的行就被匹配到,linux man手册的例子是(1~2),匹配的是所有奇数行,作为加深印象的例子
- $:直接一个$,匹配文本的最后一行
- /regexp/或\cregexpc :匹配符合正则表达式的行,注意:c可以是任意字符只需保证首尾一致!(这里着重不是讲正则表达式,不熟悉的要参见其他笔记)
- addr1,addr2:如(1,5)匹配1到5行,第1行和第5行都将会被匹配到
- addr1,+N:如(1,+5)匹配第1行之后,在往后匹配5行,也就是一共匹配6行。即将匹配第addr1行以及接下来N行
- addr1,~N:如(10,~8)匹配第10行到第16行(最近一个是8的倍数那一行)。即将匹配第addr1行以及后面最近一个行号是N的倍数的行
如何表示操作呢?有以下选项:(60%主要写法,涉及保持空间的参数未列入)
允许没有地址或只有1个地址的参数:
- =:打印正在操作的行,即当前行
- a \text:以另起新行的形式,追加text内容在指定的行后面,支持使用\n实现多行插入
- i \text:以另起新行的形式,追加text内容在指定的行前面,支持使用\n实现多行插入
- r filename:从指定文件中读取内容追加到当前行合并
允许匹配一个地址范围的参数:
- d:删除当前行(删除模式空间中的内容)
- c \text:以text内容替换指定的行,支持使用\n实现多行插入
- p:打印当前行(即打印当前模式空间)
- s/regexp/replacement/:对操作行使用正则表达式匹配指定内容,用replacement替换
- {;}:若一次不止进行一个操作,可以将多个操作参数用{}包括进来,参数之间可以用;隔开,如{a \text;p}
【input_file】域:指定要处理的文件
举2个栗子:
test文件内容如下:
1、sed -n '4,7p' test01
-n:对应option域;'4,7p':对应script域,其中4,7对于address部分,p匹配操作参数部分;test01:对应input-file域
含义:对第4到7行进行打印输出(p参数),-n选项表示静默输出,此时不输出原文本;不加-n参数时如下:
2、sed -i '4,+2s/[0-9]/12345/' test
当不加-i参数时,修改不影响原文本内容
加-i参数后,修改会被写入原文本内容
含义:对test文件的第4行开始,往后2行(即4,5,6三行)所匹配到的内容进行替换,[0-9]匹配一个数字,将该数字替换为12345,写入原文件中。
总结:个人认为sed的学习入门以此作为概览是不错的选择,以上的解释表述了如下问题:
1、sed命令的语法
2、sed命令各种部分的含义,以及分别有哪些简单,易理解的可选参数
3、简单的使用示例
深入的教程本文没有涉及,本文中有出错不妥之处,请读者提出指正~