#!/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