【问题标题】:Bash glob, how to OR over strings of non unit length?Bash glob,如何对非单位长度的字符串进行或运算?
【发布时间】:2021-09-05 16:50:41
【问题描述】:

我在一个目录中有一堆文件。每个文件的基本名称以两位数字和一个字母结尾,例如 file_01A.txt、file_03B.txt、file_13A.txt。

在使用 bash 的终端中(我假设,在 mac osx 上工作)我使用

ls *01*[AB]*.txt

返回所有文件,例如 01A 和 01B。这对我来说很有意义。

ls *02*[AB]*.txt

类似地返回所有文件,例如 02A 和 02B。

现在我想返回所有文件 01A、01B、02A、02B。因此我想要类似的东西:

ls *(01 or 02)*[AB]*.txt

尝试 1:我尝试使用 | 但这会引发错误。

尝试 2:ls *[01,02]*[AB]*.tex 但这也给出了 03 文件,因为我认为它将 01 和 02 解释为单独的匹配项。

尝试 3:ls *["01","02"]*[AB]*.tex 再次相同。

【问题讨论】:

  • 试试ls *0[12]*[AB]*.tex
  • ls *02*[AB]*.txt 将匹配名为abc02_A_325.txt 的文件,而ls *_01[AB].txt 将匹配限制为file_01A.txt;对于具体问题ls *_0[12][AB].txt
  • “bash 正则表达式”类似于[[ $name =~ (01|02}.*[AB].* ]]。您的问题是关于 glob 表达式,这是另一回事。
  • 您更有可能在 Mac 上使用 zsh,而不是 bash。
  • [12] 的工作方式与[AB] 的工作方式相同。您也可以使用逗号和|s,但不是您尝试的方式。几个例子:(a)*0[12]*[AB]*(b)*0{1,2}*{A,B}*(c)*0@(1|2)*@(A|B)*

标签: bash glob


【解决方案1】:

表达一个符合您要求的通配符并不难。

ls *0[12]*[AB]*.tex

在一般情况下,如果您不能清楚地表达一个通配符,请使用多个通配符。请注意,shell 会按照您编写它们的顺序对其进行扩展,如果它们都匹配某些文件,则会在扩展中出现重复。

ls *01*[AB]*.tex *02*[AB]*.tex

您似乎对元字符的含义感到困惑。 * 匹配任何字符串,? 匹配任何字符,[abc] 匹配方括号之间列出的任何一个字符。 [!abc] 监视不是abc 的单个字符。 Bash 还支持称为大括号扩展的扩展,其中foo{bar,quux} 基本上是foobar fooquux 的缩写。因此,您的尝试可以重新表述为

ls *{01,02}*[AB].tex

虽然重复的前缀0显然是多余的,最好留在大括号外面,然后你不妨切换回直方括号。

还有一个单独的扩展通配符语法允许更精细的通配符。详情请见reference manual

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 1970-01-01
    • 2011-04-11
    相关资源
    最近更新 更多