• Linux shell 通配符 / glob 模式


    概念

    glob 模式(globbing)也被称之为 shell 通配符,名字的起源来自于 Unix V6 中的 /etc/glob (详见 man 文档)。glob 是一种特殊的模式匹配,最常见的是通配符拓展,也可以将 glob 模式设为精简了的正则表达式,在最新的 CentOS 7 中已经删除了 glob 的相关描述文档,删除的原因由于 glob 已经整合到了 shell 之中,然后就有了 shell 通配符。

    笔者在查阅资料的时候发现关于 glob 模式或者 globbing 的相关描述以及文档是少之又少,所以特地在这里整理一下并重新写一写使用方法

    shell 通配符 / glob 模式通常用来匹配目录以及文件,而不是文本!!!
    shell 通配符 / glob 模式通常用来匹配目录以及文件,而不是文本!!!
    shell 通配符 / glob 模式通常用来匹配目录以及文件,而不是文本!!!

    语法

    字符 解释
    * 匹配任意长度任意字符
    ? 匹配任意单个字符
    [list] 匹配指定范围内(list)任意单个字符,也可以是单个字符组成的集合
    [^list] 匹配指定范围外的任意单个字符或字符集合
    [!list] 同[^list]
    {str1,str2,...} 匹配 srt1 或者 srt2 或者更多字符串,也可以是集合

    专用字符集

    字符 意义
    [:alnum:] 任意数字或者字母
    [:alpha:] 任意字母
    [:space:] 空格
    [:lower:] 小写字母
    [:digit:] 任意数字
    [:upper:] 任意大写字母
    [:cntrl:] 控制符
    [:graph:] 图形
    [:print:] 可打印字符
    [:punct:] 标点符号
    [:xdigit:] 十六进制数
    [:blank:] 空白字符(未验证)


    在使用通配符的过程中可能会遇到文件名中包含了特殊字符的情况,例如

    bash$:ls
    a        a[123]b        A[abc]123        abc!123
    a 12 b                #这是一个文件
    

    在不使用专用字符集的情况下,需要使用转义符来匹配,或者使用单引号将其框选。

    这里将 Linux shell 元字符列出,在使用通配符时如果没有进行转义可能就会被辨识为元字符

    字符 作用
    IFS 由 < space > 或 < tab > 或 < enter > 三者之一组成
    CR 由 < enter > 产生
    = 设定变量
    $ 作变量或运算替换
    > 重导向标准输出
    < 重导向标准输入
    | 命令管线
    & 重导向文件描述符,或将命令静默执行
    ( ) 将其内的命令置于 nested subshell 执行,或用于运算或命令替换
    { } 将其内的命令置于 non-named function 中执行,或用在变量替换的界定范围
    ; 在前一个命令结束时,而忽略其返回值,继续执行下一个命令
    && 在前一个命令结束时,若返回值为 true,继续执行下一个命令
    || 在前一个命令结束时,若返回值为 false,继续执行下一个命令
    ! 执行 history 中的命令

    第六行与倒数第二行居然错误了,看来博客园对 Markdown 的支持有待改进

    第六行内容:“ | ”命令管线
    倒数第二行内容:“ || ” 在前一个命令结束时,若返回值为 false,继续执行下一个命令

    示例

    这里使用 /etc 下的文件为例

    匹配以 a开头,中间包含任意数量数字的文件

    ls a*[0-9]*
    #当然你是找不到的,因为通常情况下 /etc 下没有这样的文件
    

    匹配以任意小写字母开头,中间包含数字的文件

    ls [[:lower:]]*[0-9]*
    #相信你已经看到了一些文件,我们继续
    

    列出所有文件中以 init 开头,英文结尾的文件

    ls init*[a-z]
    

    列出以 au,b,c 开头的文件

    ls {"au",[bc]}* 
    

    更多的实例可以通过搜索引擎找到,这里就不多说了

    注意事项

    • 在使用专属字符集的时候,字符集之外还需要用 [ ] 来包含住,否则专用字符集不会生效,例如 [[:space:]]
    • 想要转义的时候,单引号与双引号使用方法是不同的,单引号会转义所有字符,而且单引号中间不允许再出现单引号,双引号允许出现特定的 shell 元字符,具体字符可以自行查询
    • 在使用花括号 {} 的时候,里面的单个字符串需要使用单引号或者双引号括住,否则就会视为多个的单个字符
  • 相关阅读:
    C++类中的函数重载
    C++中的友元
    bzoj 2820
    莫比乌斯函数
    bzoj 2440: [中山市选2011]完全平方数
    莫比乌斯反演1
    [转]C++ 指针和引用
    P2756 飞行员配对方案问题
    P2055 [ZJOI2009]假期的宿舍
    P2654 原核生物培养
  • 原文地址:https://www.cnblogs.com/divent/p/5762154.html
Copyright © 2020-2023  润新知