• 幕客老师召集小伙伴
  • 运维高手36项修炼
  • python自动化运维项目实战
  • nginx从入门到实战
  • 阿里云与Centos7实战

Shell-正则表达式RE

正则表达式RE
========================================================

三种重要的文本处理工具:vim、grep、sed、awk

一、什么是正则表达式?
正则表达式(regular expression, RE)是一种字符模式,用于在查找过程中匹配指定的字符。
在大多数程序里,正则表达式都被置于两个正斜杠之间;例如/lv[oO]e/就是由正斜杠界定的正则表达式,
它将匹配被查找的行中任何位置出现的相同模式。在正则表达式中,元字符是最重要的概念。

匹配Mail: [a-z0-9_]+@[a-z0-9]+\.[a-z]+ yangsheng131420@126.com
匹配IP: [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}

[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}

二、元字符
定义:元字符是这样一类字符,它们表达的是不同于字面本身的含义
shell元字符(也称为通配符) 由shell来解析,如rm -rf *.pdf,元字符*Shell将其解析为任意多个字符
正则表达式元字符 由各种执行模式匹配操作的程序来解析,比如vi、grep、sed、awk

vim示例:
:1,$ s/tom/David/g //如anatomy、tomatoes及tomorrow中的“tom”被替换了,而Tom确没被替换
:1,$ s/\<[Tt]om\>/David/g
                               

1. 正则表达式元字符:
===基本正则表达式元字符
元字符 功能 示例 
======================================================== 
^ 行首定位符 ^love 
$ 行尾定位符 love$ 
. 匹配单个字符 l..e 
* 匹配前导符0到多次 ab*love
[] 匹配指定范围内的一个字符 [lL]ove
[ – ] 匹配指定范围内的一个字符 [a-z]ove
[^] 匹配不在指定组内的字符 [^a-z0-9]ove
\ 用来转义元字符 love\. 
\< 词首定位符 \<love 
\> 词尾定位符 love\> 
\(..\) 匹配稍后将要使用的字符的标签 \(love\)able\1er :1,$ s/\(192.168.10\).20/\1.50/g
:3,9 s/\(.*\)/#\1/ 
x\{m\} 字符x重复出现m次 o\{5\}
x\{m,\} 字符x重复出现m次以上 o\{5,\} 
x\{m,n\} 字符x重复出现m到n次 o\{5,10\}

===扩展正则表达式元字符
+ 匹配一个或多个前导字符 [a-z]+ove 
? 匹配零个或一个前导字符 lo?ve 
a|b 匹配a或b love|hate
() 组字符 love(able|rs) (ov)+
(..)(..)\1\2 标签匹配字符 (love)able\1er
x{m} 字符x重复m次 o{5} 
x{m,} 字符x重复至少m次 o{5,}
x{m,n} 字符x重复m到n次 o{5,10}

2. POSIX字符类:
表达式       功能                               示例
[:alnum:]     字母与数字字符                       [[:alnum:]]+  
[:alpha:]   字母字符(包括大小写字母) [[:alpha:]]{4}
[:blank:]     空格与制表符                         [[:blank:]]*
[:digit:]       数字字母                             [[:digit:]]?
[:lower:]       小写字母                             [[:lower:]]{5,}
[:upper:]       大写字母                             [[:upper:]]+
[:punct:]       标点符号                             [[:punct:]]
[:space:]       包括换行符,回车等在内的所有空白[[:space:]]+

三、正则匹配示例:vim
/love/ 
/^love/
/love$/
/l.ve/
/lo*ve/
/[Ll]ove/
/love[a-z]/
/love[^a-zA-Z0-9]/

/^$/
/^[A-Z]..$/ 
/^[A-Z][a-z ]*3[0-5]/ 
/[a-z]*\./ 
/^ *[A-Z][a-z][a-z]$/ 
/^[A-Za-z]*[^,][A-Za-z]*$/ 
/\<fourth\>/ 
/\<f.*th\>/ 
:1,$s/\([Oo]ccur\)ence/\1rence/ 
:1,$s/\(square\) and \(fair\)/\2 and \1 
/5\{2\}2\{3\}\./

========================================================
========================================================
练习:循环判断,输入的号码,如果是手机号,echo “手机号”。果输入的数字是ip地址,echo ip地址。
如果输入的是电话号码,echo电话号码。如果输入的一个数字都没有,直接退出循环。

#!/bin/bash
#循环判断,输入的号码,如果是手机号,输出,如果输入的数字是ip地址,输出,
#如果输入的是电话号码,输出,若输入的没有包含数字,退出循环
#History:
#2014/06/08 Zhenbl First Release

flag=1

#判断输入的字符串是否为手机号或ip地址或电话号码,若是则输出
function judgementInputStr(){
        cellphoneRE=”^1(3|4|5|7|8)[0-9]{9}”
        ipRE=”[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}”
        phoneRE=”^0[[:digit:]]{2,3}-[[:digit:]]{7,8}”
        noDigitRE=”/[^0-9]{*}/”
        if [[ $1 =~ ${cellphoneRE} ]]; then
                echo “您输入的字符串$1为手机号:$1″
        elif [[ $1 =~ ${ipRE} ]]; then
                echo “您输入的字符串$1为IP地址:$1″
        elif [[ $1 =~ ${phoneRE} ]]; then
                echo “您输入的字符串$1为电话号码:$1″
        elif [[ $1 =~ ${noDigitRE} ]]; then
                echo “您输入的字符串$1为不包含数字:$1″
                flag=0
        else
                echo “您输入的字符串不符合要求!$flag:$1″
        fi
}

while (($flag))
do
        read -p “Please input a string :” inputstr
        judgementInputStr ${inputstr}
done

Shell-正则表达式RE

Pingbacks已打开。

引用地址

暂无评论

发表评论