gpt4 book ai didi

regex - 文件名匹配的正则表达式

转载 作者:行者123 更新时间:2023-11-29 08:48:40 24 4
gpt4 key购买 nike

在 Bash 中,如何将具有多个条件的正则表达式与文件名进行匹配?例如,我想匹配所有以 .txt 或 .log 结尾的文件。

我知道如何匹配一种类型的条件:

for file in *.log
do
echo "${file}"
done

逻辑 or 匹配两种或多种类型的条件的语法是什么?

最佳答案

Bash 在通配(文件名匹配)时本身不支持正则表达式。然而,它的 globbing 语法可以非常通用。例如:

for i in A*B.{log,txt,r[a-z][0-9],c*} Z[0-5].c; do
...
done

将循环内容应用于所有以 A 开头并以 B 结尾,然后是点和以下任何扩展名的文件:

  • 日志
  • 文本
  • r 后跟一个小写字母后跟一个数字
  • c 后跟几乎所有内容

它还将循环命令应用于以 Z 开头的文件,后跟 0-5 范围内的数字,然后是 .c 扩展名。

如果你真的想要/需要,你可以使用内置的 shopt 启用扩展的 globbing:

shopt -s extglob

然后在匹配文件名时允许更多的功能,例如子模式等。

有关支持的表达式的更多信息,请参阅 Bash 手册:

http://www.gnu.org/software/bash/manual/bash.html#Pattern-Matching

编辑:

如果表达式与文件名不匹配,默认情况下 bash 将替换表达式本身(例如,它将回显 *.txt)而不是空字符串。您可以通过设置 nullglob shell 选项来更改此行为:

shopt -s nullglob

这会将没有匹配文件的 *.txt 替换为空字符串。

编辑 2:

我建议您还检查一下 shopt 内置函数及其选项,因为其中有很多会影响文件名模式匹配,以及 shell 的其他方面:

http://www.gnu.org/software/bash/manual/bash.html#The-Shopt-Builtin

关于regex - 文件名匹配的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4307770/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com