Linux管理-sed

sed全名叫stream editor 流编辑器。

s命令
用s命令替换文件中匹配的内容

zyf@zyf-ThinkPad-Edge-E545:~/Test$ cat sedfile 
This is a test file.
I am a coder.
HaHa is happy.
HeHe is not happy.
zyf@zyf-ThinkPad-Edge-E545:~/Test$ sed "s/is/was/g" sedfile 
Thwas was a test file.
I am a coder.
HaHa was happy.
HeHe was not happy.
zyf@zyf-ThinkPad-Edge-E545:~/Test$

这里出现一个问题,This 单词中的is也被替换了,Thwas明显不是我们想要的,所以全局替换一定要注意匹配准确。

zyf@zyf-ThinkPad-Edge-E545:~/Test$ sed "s/ is / was /g" sedfile 
This was a test file.
I am a coder.
HaHa was happy.
HeHe was not happy.
zyf@zyf-ThinkPad-Edge-E545:~/Test$

注意,此时并没有改变文件实际的内容,只是将改变后的结果输出打印。要想改变文件的内容,需要加上-i参数。

zyf@zyf-ThinkPad-Edge-E545:~/Test$ cat sedfile 
This is a test file.
I am a coder.
HaHa is happy.
HeHe is not happy.
zyf@zyf-ThinkPad-Edge-E545:~/Test$ sed -i "s/ is / was /g" sedfile 
zyf@zyf-ThinkPad-Edge-E545:~/Test$ cat sedfile 
This was a test file.
I am a coder.
HaHa was happy.
HeHe was not happy.
zyf@zyf-ThinkPad-Edge-E545:~/Test$

还有一些用法:

zyf@zyf-ThinkPad-Edge-E545:~/Test$ sed "s/^/#/g" sedfile 
#This was a test file.
#I am a coder.
#HaHa was happy.
#HeHe was not happy.
zyf@zyf-ThinkPad-Edge-E545:~/Test$

在每行开头加上#字符

zyf@zyf-ThinkPad-Edge-E545:~/Test$ sed "s/$/\//g" sedfile 
This was a test file./
I am a coder./
HaHa was happy./
HeHe was not happy./
zyf@zyf-ThinkPad-Edge-E545:~/Test$ 

在每行最后追加/符号。”\/”中的\符号是转义符,因为/是个特殊符号需要转义才能显示这个符号本身。
顺手介绍一下正则表达式的一些最基本的东西:

^ 表示一行的开头。如:/^#/ 以#开头的匹配。
$ 表示一行的结尾。如:/}$/ 以}结尾的匹配。
\< 表示词首。 如 \<abc 表示以 abc 为首的詞。
\> 表示词尾。 如 abc\> 表示以 abc 結尾的詞。
. 表示任何单个字符。
* 表示某个字符出现了0次或多次。
[ ] 字符集合。 如:[abc]表示匹配a或b或c,还有[a-zA-Z]表示匹配所有的26个字符。如果其中有^表示反,如[^a]表示非a的字符
---摘于coolshell大神博客

c命令
有天需要写脚本修改/etc/sysconfig/clock文件中的时区,好久没搞出来,后来在coolshell里看到这个c命令介绍,c命令的作用就是替换匹配行。

zyf@zyf-ThinkPad-Edge-E545:~/Test$ cat sedfile 
This was a test file.
zoneinfo="/usr/share/zoneinfo/Asia/Beijing"
zyf@zyf-ThinkPad-Edge-E545:~/Test$ sed "/zoneinfo=/c zoneinfo=\"/usr/share/zoneinfo/Asia/Karachi\"" sedfile
This was a test file.
zoneinfo="/usr/share/zoneinfo/Asia/Karachi"

就是将匹配词所在的一行换为后面的这句话。

a命令和i命令

zyf@zyf-ThinkPad-Edge-E545:~/Test$ sed "/zoneinfo=/i insert one line" sedfile 
This was a test file.

标题

insert one line
zoneinfo="/usr/share/zoneinfo/Asia/Beijing"
zyf@zyf-ThinkPad-Edge-E545:~/Test$ sed "/zoneinfo=/a append one line" sedfile 
This was a test file.
zoneinfo="/usr/share/zoneinfo/Asia/Beijing"
append one line

a是在匹配行后追加一行,i是在匹配行前插入一行。
也可以用sed “1 i xxxx” file是在第一行前插入一行xxx;sed “$ a xxx” file是在最后一行后追加一行xxx

d命令

zyf@zyf-ThinkPad-Edge-E545:~/Test$ cat sedfile 
This was a test file.
zoneinfo="/usr/share/zoneinfo/Asia/Beijing"
zyf@zyf-ThinkPad-Edge-E545:~/Test$ sed "/zoneinfo=/d" sedfile 
This was a test file.

d命令,删除匹配行。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值