文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>关于grep匹配tab键

关于grep匹配tab键

时间:2006-06-13  来源:busyant

系统管理的时候碰到这样一个问题: a.txt文本文件中存储着中文姓名,每行一个,如: 李明 王皓 李明君 b.txt文本文件中存储着邮箱地址,中文姓名,所属部门等信息,每个信息用tab键隔开,每行一条数据,如: [email protected] <tab>李明<tab>人力资源部 [email protected] <tab>李明01<tab>IT支持部 [email protected] <tab>李明君<tab>销售管理部 [email protected] <tab>王皓<tab>IT支持部   需要根据a.txt中的姓名提取b中的邮箱地址,于是编写脚本如下:
#!/bin/sh USERS=`cat a.txt`
for USER in $USERS ; do
        CNT=`grep "$USER" b.txt|wc -l|awk '{print $1}'`
        MAIL=`grep "$USER" b.txt`
        if [ $CNT -gt 1 ]; then
                printf "$MAIL\n"
        else
                MAIL2=`grep "$USER" b.txt|awk -F'\t' '{print $1}'`
                printf "$MAIL2\n"
        fi
done
  但因为姓名当中重复文字的原因,导致查找“李明”时会查找出“李明01”和“李明君”,因为需要匹配出带数字的帐户,但匹配出“李明君”显然是错误的,于是修改为:
#!/bin/sh USERS=`cat a.txt`
for USER in $USERS ; do
        CNT=`grep "$USER[0-9]\{0,2\}" b.txt|wc -l|awk '{print $1}'`
        MAIL=`grep "$USER[0-9]\{0,2\}" b.txt`
        if [ $CNT -gt 1 ]; then
                printf "$MAIL\n"
        else
                MAIL2=`grep "$USER[0-9]\{0,2\}" b.txt|awk -F'\t' '{print $1}'`
                printf "$MAIL2\n"
        fi
done
  问题依然存在,“李明君”同样会被匹配出来,于是想到匹配后面的这个tab键,但尝试了N种方法: grep "$USER[0-9]\{0,2\} "————失败,因为不是空格; grep -P "$USER[0-9]\{0,2\}\s"——想用perl里面的\s,同样失败; grep "$USER[0-9]\{0,2\}<tab>"——《Linux Shell编程》里面是这样写的,结果仍然是失败; 最后没辙了,搜cu里面的精华贴,搜到一个,提问匹配tab键的,但回复都是替代方法,而没有根本的解决问题, 于是google,找啊找…… 不知道是哪一页了突然看到这段(http://www.yuanma.org/data/2006/0509/article_376.htm)

  grep允许使用国际字符模式匹配。类名及其等价的正则表达式:

    类 正则表达式

    [[:upper:]]         [A-Z]

    [[:lower:]]         [a-z]

    [[:digit:]]         [0-9]

    [[:alnum:]]         [0-9a-zA-Z]

    [[:space:]]         空格或tab键

    [[:alpha:]]         [a-zA-Z]

  就是它了,于是修改成如下:
#!/bin/sh USERS=`cat a.txt`
for USER in $USERS ; do
        CNT=`grep "$USER[0-9]\{0,2\}[[:space:]]" b.txt|wc -l|awk '{print $1}'`
        MAIL=`grep "$USER[0-9]\{0,2\}[[:space:]]" b.txt`
        if [ $CNT -gt 1 ]; then
                printf "$MAIL\n"
        else
                MAIL2=`grep "$USER[0-9]\{0,2\}[[:space:]]" b.txt|awk -F'\t' '{print $1}'`
                printf "$MAIL2\n"
        fi
done
  正解!
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载