(Linux文本处理神指令)sed介绍.附详细例子(上)

#最近学习了一个文本处理指令sed,感觉功能很强大,所以自己总结了一下该指令比较常用的一些功能及操作,希望能跟大家分享一下

#由于本文的内容都是由本人亲自编写的,所以不排除会有错别字或错漏的地方,如果大家能给我指出来,我会很感激的,也希望能在跟大家的交流中学习到更多的知识



sed
专长:字段重排序输出,字段替换

可实现的主要操作有:
匹配并替换文本内容
输出指定内容
输出满足一定条件的文本


工作原理:
1、sed的是线性工作的,简单点来说就是它对文本是一行一行地来处理的,例如要输出一段文本,并指定输出的内容中没有原文本的第5行,sed先会找到整段文本的第一行,然后查看是否满足条件(这里也就是用户指定的第5行),不满足条件,输出后再查找下一行,直到找到第五行。满足了条件,所以删除掉不输出。但是,sed没有停止工作,一直到最后一行处理完,它才会停止工作。这也就是sed的线性工作过程。
2、sed的另一个特点是sed对文本的操作,若没有用特殊的参数指定是对源文件进行修改的话,那么它的工作工程就相当于把源文件中的文本取出来放在一个临时文件中,然后对临时文件中的内容进行修改并输出后,再把临时文件删除掉。也就是说源文件的内容是不会发生变化的。

用法:
1.sed [options] 'sed代码(语句与语句间用;隔开)' /path/to/file
2.command(如cat,echo等) | sed [options] 'sed代码'
注意:sed代码不同于awk(另一种文本处理指令),它不支持c语言风格的代码,它支持的是vi编辑器风格的代码

options对应的主要参数有以下几种:
-e   e是excuse的简写,在这里表示执行'sed代码'
-n   抑制sed在执行打印操作时的自动打印,即抑制不满足条件的行也被打印出来,下面例子会详述
-i   对源文件的内容进行替换修改(默认操作只是输出源文件的内容)
-r   允许使用规范的表示法(man说的),也就是允许一些特殊符号的使用,例如在‘sed代码’中,如
     果没有使用到-r参数,那么在使用()的时候就必须要用转义字符\来描述,即\(和\),用的-r
     参数后就可以直接用()了(我说的)

好,理解了sed的大概内容后,总结一下用sed能实现的功能和具体的例子吧~

功能1:删除 
sed代码关键字 d :d是delete的缩写,类似于vi编辑器的删除

例子:
warning:例子中出现的/tmp/passwd是/etc/passwd的复制文件,/etc/passwd是系统的重要文件,记录着所有用户的信息,请大家慎重对待,最好不要轻易对它进行任何操作哈!)

1、删除所有行并输出
指令:# sed -e 'd' /tmp/passwd
解释:此指令中options为-e,表示执行'sed代码',而此指令中的'sed代码‘为'd'表示删除,由于没有指定要删除第几行,所以根据sed的线性工作特性,sed指令处理到文本的每一行,都执行一次删除指令,所以最终的输出结果是什么都没有。

2、只删除第一行
指令:# sed -e '1d' /tmp/passwd
解释:此指令中的'sed代码'为'1d',1d表示删除第一行,当然如果想删除第2行,'sed代码'就应该是'2d',删除第n行当然就是'nd'咯(有点类似vi编辑器的风格)。再一次罗嗦一下线性的特性吧,例如要删除第二行,sed代码为2d,当sed处理文本的第一行时,程序先会分析第一行是否是要删除的第二行,分析发现不是后就输出了第一行。然后分析文本的第二行,这是发现是第二行了,就把第二行的内容删除掉。所以输出的内容就没有第二行了。这是sed的操作还没有结束,还会继续对文本下面的行进行操作,知道最后一行,当然下面的行也不是用户指定的第二行,所以都被输出啦~

3、删除第1行到第3行(注意:与删除第1行和第3行的区别)
指令:# sed -e '1,3d' /tmp/passwd
解释:还记得我说过'sed代码'的特点吗?没错啦,就是'vi编辑器风格'!vi编辑器风格如果表示第一行到第三行呢?没错,就是1,3  所以在该指令中的'sed代码'就是'1,3d'。输出的结果就是除了第一行和第三行意以外的所有行。这里也就不再罗嗦sed的工作原理了,大家还有不了解的话可以联系我哈。很希望有个机会可以跟大家交流。

4、只删除第1行和第3行
指令:# sed -e '1d;3d' /tmp/passwd
解释:其实也很容易理解,'1d,3d'其实也就是等于设定两个条件,两个条件之间用分号来隔开,所以以后记住了,想设定两个条件的话,可以用逗号来隔开。

5、删除包含root关键字的行
指令:# sed -e '/root/d' /tmp/passwd
解释:大家还记得在vi编辑器中是如何用关键字查找相应内容的吗?方法就是/keyword,所以同样道理,在sed指令里面/root/也可以定位出含有root关键字的行,这是再加上一个指令d,也就会把含有root关键字的含都删除掉了,所以输出的结果是不含有root关键字的所有行.所以总结一下删除含关键字的行的方法:  sed -e '/关键字/d' /path/to/file

6、删除以daemon开头的所有行
指令:# sed -e '/^daemon/d' /tmp/passwd
解释:这里就是考验大家有关正则表达式的内容了,所以为了方便大家学习,本文最后介绍了一些比较常用的正则表达式,当然本文中也穿插了一些含正则表达式的例子。这里就先说这个例子的吧。以daemon开头用正则表达式就是表示为/^daemon,再加上表示删除的d,这个例子的输出结果当然就是所有以daemon开头的行都被删除掉而没有显示了。这里再罗嗦一句,我所说的删除不是指源文件的内容被删除哦。

7、删除以nologin结尾的所有行
指令:# sed -e '/nologin$/d' /tmp/passwd
解释:难点依然还是正则表达式,以nologin结尾的正则表达式为/nologin$。

8、删除所有的空行
指令:# sed -e '^$' /tmp/passwd
解释:遇到这种情况,或许大家首先会想是否会有特殊的参数可以使sed指令能完成这个操作。或许真的有,只是我不知道而已,但是指令那么多,而且参数又那么多,谁又能全部记住且记准呢?所以这里告诉我们可以换个角度思考问题,空行也可以用正则表达式来描述。空行就是什么内容都没有,所以空行就是以空字符开头,也是用空字符结尾,用正则表达式来表示也就是^$.请注意:空格跟空字符的区别!!!如果一行中输入了空格,那么这一行就不能看成是空行了,这里也就不详细解释为什么了,因为这是老生常谈的问题了。

9、删除所有以#开头的行以及空行
指令:# sed -e '/^$/d;/^#/d' /tmp/passwd
解释:其实也不用解释了,还是刚刚的那个问题,两个语句之间用分号隔开就行了。这里还有一个地方要注意的,我所举的例子,/tmp/passwd里面不一定有满足条件的行,所以大家想要看结果的话,最好还是自己修改一下文本吧。

10、删除以daemon开头的行和以lp开头的行之间的所有行
指令:# sed -e '/^daemon/,/^lp/d' /tmp/passwd
解释:可以对照删除1到3行的例子,删除1到3也就是1,3d,所以对应起来,daemon开头的行到lp开头的行表示起来就是/^daemon/,/^lp/,再加上个d,也就完成相应的操作了。


#由于内容太多,所以只好分上下两篇博文了,该文的下篇马上就会推出,敬请期待,下篇含有打印和修改功能等。

#联系方式:Wechat ShalomLin  QQ:373381362


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值