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,""都不好使