shell三剑客之sed

1.经典案例一

输入一串随机数字,然后按千分位输出。

比如输入数字串为“0123456789”,输出为0,123,456,789

[root@localhost ~]# echo 0123456789 |sed -r '{:a;s/([0-9]+)([0-9]{3})/\1,\2/};t a'


解读:
sed -r 支持扩展正则表达式, (特殊字符就不需要用\转义了)
:a ta 表示ta前面的命令执行成功后,再返回到a开始执行,a 为标识符
+ 匹配前面字符1个或者多个
{3} 匹配前面字符3个
\1 第一个分组
\2 第二个分组

分解理解:
第一步:
[root@localhost ~]# echo 0123456789 |sed -r '{s/([0-9]+)([0-9]{3})/\1,\2/}'
0123456,789

# \1 对应([0-9]+) 匹配前面数字1个或者多个 #这最好加上(^[0-9]+) 行首锚定好理解
# \2 对应([0-9]{3}) 匹配前面数字3个

第二步:
[root@localhost ~]# echo 0123456789 |sed -r '{:a;s/([0-9]+)([0-9]{3})/\1,\2/};t a'
0,123,456,789

当一次执行完毕后,结果是:0123456,789 下标又回到这一行重新开始,即从0开始
再执行第二次,这时的表达式处理对象是0123456, 逗号及后面的数字没有匹配就不再处理,结果是:0123,456,789 
再执行第三次,这时的表达式处理的对象是0123 ,逗号及后面的数字没有匹配就不再处理,结果是0,123,456,789
以此类推,最后一步:剩下一个0,不匹配,就不再执行了。

2.经典案例二

文件内容如下:

[root@localhost ~]# cat members.txt
user01 user02 user03 user04 user05 user06 user07
user08 user09 user10 user11 user12 user13 user14
user15 user16 user17 user18 user19 user20 user21
user22 user23 user24 user25 user26 user27 user28
user29 user30 user31 user32 user33 user34 user35
user36 user37 user38 user39 user40 user41 user42
user43 user44 user45 user46 user47 user48 user49
user50

要求将最后一行user50,添加到倒数第二行行末
[root@localhost ~]# var=`tail -n1 members.txt`
[root@localhost ~]# sed -i '$d' members.txt
[root@localhost ~]# sed -i '$s/.*/& '$var'/g' members.txt
[root@localhost ~]# cat members.txt
user01 user02 user03 user04 user05 user06 user07
user08 user09 user10 user11 user12 user13 user14
user15 user16 user17 user18 user19 user20 user21
user22 user23 user24 user25 user26 user27 user28
user29 user30 user31 user32 user33 user34 user35
user36 user37 user38 user39 user40 user41 user42
user43 user44 user45 user46 user47 user48 user49 user50

划重点:
sed -i '$s/.*/& '$var'/g'
$:替换最后一行
.*:最后一行的所有内容
&:引用前面.*的内容
'$var':引用变量,注意必须要''括起来,用eval,""都不好使

转载于:https://www.cnblogs.com/xiangtanglaojing/p/7455859.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值