Linux之sed:修改器按照字符和行数进行筛选和替换行值 选项[动作

 说明

sed用于选取替换删除新增   sed [选项] [动作][文件]

选项:    
-n:一般sed命令会把所有数据都输出到屏幕,如果加入此选择,则只会把经过sed命令处理的行输出到屏幕。    
-e:允许对输入数据应用多条sed命令编辑。    
-f 脚本文件名:从sed脚本中读入sed操作。和awk命令的-f非常类似。    
-r:在sed中支持扩展正则表达式。    
-i:用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出

动作:    
a \:追加,在当前行后添加一行或多行。添加多行时,除最后一行外,每行末尾需要用“\”代表数据未完结。    
c \:行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需用“\”代表数据未结。    
i \:插入,在当期行前插入一行或多行。插入多行时,除最后一行外,每行末尾需要用“\”代表数据未完结。    
d:删除,删除指定的行。
p:打印,输出指定的行。    
s:字串替换,用一个字符串替换另外一个字符串。格式为“行范围s/ 旧字串/新字串/g”(和vim中的替换格式
类似)。


sed所做的修改并不会直接改变文件的内容(如果是用管道符接收的命令的输出,这种情况连文件都没有),
而是把修改结果只显示到屏幕上,除非使用“-i”选项才会直接修改文件。

查询

-n只输出合乎条件的
p显示第二行
sed -n '2p' test.txt
输出:22 bb

i修改
d删除第二行
sed -i '2d' test.txt

删除

删除第2行
m,n 表示对m和n行之间的所有行进行操作,也包含第m行和第n行
m,$ 表示对m行以及其后面的所有行进行操作
2d表示仅仅删除第2行
[root@localhost string]# sed '2d' t1.txt > t4.txt
[root@localhost string]# cat t4.txt 
t1t1t1t1t1t1t1t1t1t1t1t1t1

删除以2开头的行
sed '/^2/d' test.txt

删除包含2的文件
sed '/2/d' test.txt

新增:a后i前c替换行s替换字符串

sed '1a hello world' test.txt
其中a命令表示在指定行的后面附加一行,1a则是在第一行的后面添加一行,添加的内容就是a后面的内容,如
果a的前面没有地址限定则在所有行的后面都会添加指定的字符串

sed '1i hello world' test.txt
命令i表示在指定的行的前面插入一行,插入的内容为其后面的字符串

sed '1c hello world' test.txt
命令c会替换指定的行的所有内容,替换成其后面的字符串,所有的新增,删除,替换行,这些命令前面的地址
修饰都可以指定地址空间,也都可以使用正则表达式,命令会应用在选出的符合地址条件的所有行上面,如:
sed '/^2/c hello world' test.txt
替换以2开头的行,其内容是c命令后面的字符串

替换部分字符串而不是整行
sed 's/aa/AA/' test.txt
s/待替换的字符串/新字符串/ 也就是说使用后面的 AA 替换文件中出现的前面的 aa
sed '1s/aa/AA/g' test.txt
加上g选项之后,全局替换,也就说一行中所有符合条件的旧字符串都会被替换成新字符串,而不仅仅是第一个
可以看到仅仅对第一行进行了替换操作,其他的地址限定方法同样也是可以使用的,我们可以使用m,n的限定,
sed '5,$s/aa/AA/g' test.txt
sed '/^[0-9]/s/aa/AA/g' test.txt
我们在s命令前面添加了 /^[0-9]/ 这个修饰,该正则表达式表示对所有以数字开头的行,执行s操作


元字符

$ 表示行尾
^ 表示行首
[a-z0-9]表示字符范围
[^]表示除了字符集中的字符以外的字符

sed的正则中  \(\)  和 \{m,n\} 需要转义
. 表示任意字符 
* 表示零个或者多个 
\+ 一次或多次  
\? 零次或一次   
\| 表示或语法

例子

sed -n '/^2011-08-23.*ERROR/p' demolog.log

2011-08-23 19:57:30,709 [] ERROR bo.CommodityCerOrderBO - order-fi
2011-08-23 19:57:31,721 [] ERROR bo.CommodityCerOrderBO - order-f


提取demo.log中的日期,日志级别,订单id和状态。
sed -f demo.sed2 demo.log
#下面的一行是替换指令,就是把19位长的日期和INFO/ERROR,id,和后面的一截提取出来,然后用@分割符把这
4个字段重新按顺序组合
s/^\([-\: 0-9]\{19\}\).*\(INFO\|ERROR\) .*order-fix.curr_id:\([0-9]\+\),\(.*$\)/\1@\3@\2@\4/p 

输出:
2011-08-23 19:57:30@10117@INFO@status:attr_ids不含0跳过
2011-08-23 19:57:30@10117@ERROR@status:添加属性id,但由于认证分类参数有误默认取匹配属性名称的第
一个属性id:100104
2011-08-23 19:57:31@10117@ERROR@status:添加属性id,但由于认证分类参数有误默认取匹配属性名称的第
一个属性id:100105

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值