浅尝sed

文前小记:去年找到工作之后,一直没时间打理自己的博客,最近在实习,打算把现在学到的一些东西做一个整理,然后继续耕耘自己的博客,看到一个百度的师兄去美国了,顿时觉得人生其实可以过得不一样,任何时候都不要对自己放弃

man 一下sed,linux会告诉你sed是一种流编辑器,神马是流编辑器,我的理解就是它是对文件流,输入流之类的进行编辑,基本格式:

sed -comm pattern file

如果你不输入文件,就等待标准输入流喽(还是处理文件比较有意义),简单建立一个文件:

Today is 2014/5/1,Today is a festival
It rained yesterday
tomorrow will be Saturday

我常用的几种用法:

1.替换命令s

将Today替换为today

#sed s/Today/today/g sed.txt
today is 2014/5/1,today is a festival
It rained yesterday 
tomorrow will be Saturday

pattern你可以这样写,你也可以's/Today/today/g's/Today/today/g‘,你甚至可以”s/Today/today/g's/Today/today/g“,三种用法的区别在于单引号可以解析类似$这样的正则表达式,建议用单引号,g的作用是替换这行所有的匹配,那就引出了替换一次,两次怎么办?

将第一个Today替换为today

sed s/Today/today/1 sed.txt 
today is 2014/5/1,Today is a festival
It rained yesterday 
tomorrow will be Saturday

将第二个Today替换为today

sed s/Today/today/2 sed.txt
Today is 2014/5/1,today is a festival
It rained yesterday 
tomorrow will be Saturday
这个时候我们打开源文件看看,发现源文件竟然没变,这里面涉及到了一个概念:模式空间sed其实将处理文件的每一行放入模式空间,然后对模式空间中内容进行处理输出(vi是把处理的文件都放入内存,但是sed放一行到内存,处理完输出到屏幕,然后再读下一行),如果想修改源文件可以使用-i,但是我不推荐这么做,这恰恰是sed的哲学,万一你修改了源文件,就回不来了,所以我们通常把处理完的结果重定向到另一个文件,除非你对这次操作很自信啦(^_^)。

文件的开头都加入#

sed 's/^/#/g' sed.txt
#Today is 2014/5/1,Today is a festival
#It rained yesterday 
#tomorrow will be Saturday
这里面的^是正则表达式里面的内容,不熟悉需要自己加油,为什么写这个命令,因为我们知道python脚本是没有多行注释的,这样我们就可以利用这条语句多行注释啦(自作聪明了一下呵呵)

2.删除命令d

其次用的比较多的就是删除命令了,

删除第一行

sed 1d sed.txt 
It rained yesterday 
tomorrow will be Saturday
删除含有tomorrow的行

sed '/tomorrow/d' sed.txt 
Today is 2014/5/1,Today is a festival
It rained yesterday
删除第二行到最后一行

sed '2,$d' sed.txt
Today is 2014/5/1,Today is a festival

3.打印命令p

这个命令就不说了,匹配打印,可以当grep来使用

sed /Today/p sed.txt
Today is 2014/5/1,Today is a festival
Today is 2014/5/1,Today is a festival
It rained yesterday 
tomorrow will be Saturday
我们发现它把模式空间的内容也打印出来了,这里我们可以使用-n参数

4.插入命令a和i

在某行的前面插入就用i,在某行的后面插入就用a

文件开头插入BEGIN,结尾插入END

sed  -e '$a END' -e '/Today/i BEGIN' sed.txt
EGIN
Today is 2014/5/1,Today is a festival
It rained yesterday 
tomorrow will be Saturday
END
多个命令的时候我们可以-e来分隔


其它的一些,例如如果找到某个单词之后想替换这行,就用-c命令

sed '/Today/c this is first line' sed.txt 
this is first line
It rained yesterday 
tomorrow will be Saturday

那如果我找到某个单词,想将这行的另一个单词替换掉呢?

sed '/Today/s/is/IS/g' sed.txt
Today IS 2014/5/1,Today IS a festival
It rained yesterday 
tomorrow will be Saturday
是不是有种庖丁解牛的感觉,对每一个单词都可以这样做,那如果我不光是替换,还有其它操作呢

比如在这个单词后面增加一个字母呢?

sed 's/\(Today\)/\1++/g' sed.txt 
Today++ is 2014/5/1,Today++ is a festival
It rained yesterday 
tomorrow will be Saturday
解释一下,\(Today\)把Today取了出来作为变量,然后利用\1来取用这个变量,高级吧





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值