linux sh脚本使用正则获取行中子字符串

root@chrd-mail:/var/www/edm/ssh# vi assay.sh
#!/bin/bash

# get args[1]
logStr=$1

# get sender

# the exrep must have (),and all must escape

# 在sh中,:并不是"特殊字符",无需转义,但是+号好像是,必须要转义才能用,有点郁闷,\w之类的不能使用.

sender=`expr "$logStr" : '.*:\([a-zA-Z0-9_\.]\+\)@[a-zA-Z0-9_\.]\+>'`
echo $sender

# remember exit
exit 0



=======================这是sh代码========

expr match "$string" '\($substring\)'从$string的开头位置提取$substring*expr "$string" : '\($substring\)'从$string的开头位置提取$substring*expr match "$string" '.*\($substring\)'从$string的结尾提取$substring*expr "$string" : '.*\($substring\)'从$string的结尾提取$substring*

 

在上表中.

expr "$string" : '\($substring\)'

这个表达式,对于一定要转义()我不是很明白

但是我尝试发现这个表达式的理解应该是

从字符串的第一个字匹配开始,首先全局匹配成功后才会有子匹配.并不是像js样那样理解,它会从任何位置开始匹配,它必须从首个字符匹配.

所以,你为了让子匹配成功,必须写好整个匹配

它有点像javascript的

^(.+)

它就相当于sh的

'\(.\+)\'

这样就是从0字匹配.至于为什么sh要转义\+我有点搞不明白为什么,我测试是ubuntu linux

如果你想从任何位置匹配

javascript的

^.*(.+)

相当

'.*(.+)

sh的,也就是所谓的从后面匹配,其实它只是让前面的东西先匹配掉,子匹配就可以从任何地方开始.

 

==========看sh运行结果===========

root@chrd-mail:/var/www/edm/ssh# ./assay.sh "...kdkjfjk:ekkjeifj@kdkjkf.com.com>"

输出结果如下
ekkjeifj

其实我意思是得到行中的邮箱地址的名字部分.

非常麻烦.首次使用.都搞不明白怎么回事.

 

=============另一次输入参数运行的结果=========

root@chrd-mail:/var/www/edm/ssh# ./assay.sh "Dec 20 11:00:03  17
E8B100088:service.hr.qi_16@myhrd.cn>carina_liqian@yahoo.com.cn, relay=mx1.mail.cnb.yahoo.com[203.209.228.250]:25, delay=1.8, delays=0.11/0.05/1.2/0.44, dsn=2.0.0, status=sent (250 ok dirdel)" 

输出如下
service.hr.qi_16

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值