AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

    • 主页
    • 系统&网络
    • Ubuntu
    • Unix
    • DBA
    • Computer
    • Coding
    • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 733626
Accepted
Veak
Veak
Asked: 2023-01-30 12:55:21 +0800 CST2023-01-30 12:55:21 +0800 CST 2023-01-30 12:55:21 +0800 CST

全局和正则表达式匹配

  • 772

Bash有两种类型的模式匹配,Glob和Regex. 一般使用规则似乎是 1)glob搜索文件名更简单 2)regex用于搜索文本。

Glob在前面regex使用元字符,在结尾使用元字符pattern。

Glob          Regex
?(pattern)    (pattern)?
*(pattern)    (pattern)*     
+(pattern)    (pattern)+    

因此,我很难理解文件如何与通配符(例如*.sh)匹配。通配符与 glob 模式有什么不同吗?据我所知,搜索模式*.sh不包含匹配 . 之后的任何字符的元字符*。

bash
  • 1 1 个回答
  • 37 Views

1 个回答

  • Voted
  1. Best Answer
    roaima
    2023-01-30T15:13:12+08:002023-01-30T15:13:12+08:00

    通配符是 glob 模式的一部分。最简单*的?是通配符,也是 glob 模式。下面是一些简单的 glob:

    *.sh              # could match "fred.sh" and also ".sh"
    matchme           # would match "matchme"
    file[0-9]*.txt    # could match "file12.txt" but also "file12yz.txt"
    ?ile              # could match "mile" or "file" but not "smile"
    

    您在问题中列出的 glob 模式是扩展的glob 模式。因为bash它们在[[ "$var" == {pattern} ]]构造中处于活动状态,但仅在extglob启用时才可用于文件名匹配:

    shopt -s extglob        # Enable extended globs (bash)
    ls -d +([[:digit:]])    # List files/directories whose names are just digits
    

    据我所知,搜索模式*.sh不包含元字符以匹配之后的任何字符*

    该模式*.sh使用*将匹配零个或多个字符的通配符。请记住,glob 不是正则表达式(普通的或扩展的),但它们是等价的:

    Glob            RE              Description
    
    *.sh            ^.*\.sh$        Match anything ending with the three characters ".sh"
    ?ile            ^.ile$          Match any single character then the text "ile"
    +([[:digit:]])  ^[[:digit:]]+$  Match one or more digits (potentially any alphabet, not just 0-9)
    
    Extended Glob   ERE             Description
    @(one|two)      ^(one|two)$     Match either "one" or "two"
    

    请注意,要匹配“一”或“二”的普通 RE 需要标出括号和分隔符,即^\(one\|two\)$,因为它们不包括在内。相反,扩展正则表达式确实包括这些运算符,即^(one|two)$

    • 2

相关问题

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助
subwaysurfers
my femboy roommate

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve