zoukankan      html  css  js  c++  java
  • [RH134] 2-通配符与正则

    1.通配符

    通配符一般用于shell。

    1)常用符号 [] 

    "[]"中的字符只会匹配一个,例如:

    ha[abc]llo   # 可以匹配到haallo、habllo、hacllo

    或者使用[a-z]这种形式,表示abcd...xyz所有小写英文字母:

    ha[a-z]llo

    除了[a-z]以外,还有[A-Z][0-9]等,表示一个范围,这个范围应该是根据ASCii码编号顺序来的。

    如果要取反,则使用"^"或者"!",例如:

    ha[^a-z]lo  # [^a-z]匹配一个非小写字母的任意字符
    ha[!0-9]lo  # [!0-9]匹配一个非数字的任意字符

    注意,如果要匹配"-",则需要转义:

    ha[^a-z]lo  # [^a-z]匹配的是非a、-、z的其他字符,这里的-不表示范围,因为被转移为普通字符"-"

    2)常用符号 ?

    "?"代表一个任意字符。例如:

    ab?  # 只能匹配到abc、abx、ab3等,不能匹配到abcd、ab33等
    ab??  # 只能匹配到ab33、abcd等,不能匹配到ab3或abcfe等

    即,一个"?"表示一个任意字符,如果需要多个,则重复使用"?"。

    3)常用符号 * 

    "*"表示任意长度的任意字符,即0个或多个任意字符。例如:

    aa*  # 可以匹配到aa开头的所有字符

    4)几种常用字符分类符号

    [[:upper:]]:匹配一个纯大写字母,相当于[A-Z]
    
    [[:lower:]]:匹配一个纯小写字母,相当于[a-z]
    
    [[:digit:]]:匹配一个纯数字,相当于[0-9]
    
    [[:alpha:]]:匹配一个字母(大小写都可以),相当于[a-zA-Z]
    
    [[:alnum:]]:匹配一个字母或数字(alpha+number),相当于[0-9a-zA-Z]

    2.正则

    正则比通配符强大得多,一般用于sed/awk/php/perl/python等高级语言。

    1)grep和egrep

    grep也支持有限的正则功能,egrep是扩展的grep,支持更多正则功能,egrep=grep -E。

    egrep也不是支持所有的正则功能,如果我们需要更全的正则,可以使用grep -P,调用perl语言的正则。

    2) ^ 符号,表示行开头

    [root@centos7 xx]# grep root passwd 
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin

    不使用"^"时,可以匹配所有含root的行。

    [root@centos7 xx]# grep ^root passwd 
    root:x:0:0:root:/root:/bin/bash

    使用"^"时,只能匹配root开头的行。

    3) $ 符号,表示行结尾

    4)  ,表示以单词开头或结尾

    grep 'tom' test  # 匹配到所有以tom开头的单词所在的行,例如haha tomxxx go、tom、tomyy等
    grep 'tom' test  # 匹配到所有以tom结尾的单词所在行,例如xxxtom、haha yytom、tom等
    grep 'tom' test  # 匹配单独的tom

      作为单词开头时,可以用 < 代替。作为结尾时,可以用 > 代替。

    5) . 符号,表示一个任意字符(包括空格)

    [root@centos7 xx]# cat test
    ok s
    ok
    sdf ok sdf
    fn ok123 ds
    freok333
    [root@centos7 xx]# grep 'ok.' test
    ok s
    sdf ok sdf
    fn ok123 ds
    freok333

    'ok.'除了单独的'ok'无法匹配(ok后什么都没有),其他的都匹配到了,包含空格。

    正则中的 . 和通配符中的 ?相似。 

    6) ? 符号,表示他前面的字符出现0或1次

    注意区分正则和通配符的 ?

    grep 'ok.?' test   # 什么都没找到

    应该使用:

    [root@centos7 xx]# egrep ok.? test
    ok s
    ok
    sdf ok sdf
    fn ok123 ds
    freok333

    或者:

    [root@centos7 xx]# grep -E 'ok.?' test
    ok s
    ok
    sdf ok sdf
    fn ok123 ds
    freok333

    使用括号括起来作为整体:

    egrep 'ok(...)?' test  # ok后面,3个字符作为整体,存在0组或1组

    7) +符号,表示前面的字符出现1次或多次

    过滤文本中所有含网址的行(例如www.baidu.com):

    egrep 'www..+.com' test

    8) * 符号,表示前面的字符出现0次或多次

    9) {m,n} 符号,表示前面的字符最少出现m次,最多出现n次

    也可以限制具体次数,例如{m},前面字符出现m次。

    10) [] 符号,同通配符的用法

    包含 [[:upper:]] 这种用法,在正则中也可以使用。

    grep -E '[[:lower:]][[:digit:]]+' test

    11)使用sed替换内容

    sed 's/(.+_PW)=[0-9a-z]+/1=redhat/g' aa.txt

    这里括起来的 .+_PW 匹配到的内容,会在后面的 1 处保留,而 =[0-9a-z]+ 匹配到的内容,会被 =redhat 替换。

    ===

  • 相关阅读:
    数据挖掘算法-Apriori Algorithm(关联规则)
    分类指标准确率(Precision)和正确率(Accuracy)的区别
    数据预处理(完整步骤)
    linux下使用tar命令
    (LeetCode 135) Candy N个孩子站成一排,给每个人设定一个权重
    海量数据处理算法—Bit-Map
    Python 3.x 连接 pymysql 数据库
    visio扩大画布的大小
    中文latex去掉图片描述
    LaTeX 中文段首空格问题
  • 原文地址:https://www.cnblogs.com/leokale-zz/p/12543680.html
Copyright © 2011-2022 走看看