regex - 如何将字符串的一部分与 bash 中的正则表达式匹配?

标签 regex linux bash shell scripting

我正在使用正则表达式来匹配许多具有相似名称的文件名。请参阅下面的文件。

file1="CGInoimport"
file2="doCGIimport"
file3="donoCGInoimport"
file4="importCGIno"

我正在使用 for 循环遍历每个文件变量以检查正则表达式是否匹配。我正在尝试隔离包含单词 CGI 的文件名。这是我目前所拥有的。

for (( i=1; i < 5; i++ )) ; do
    if [[ file$i =~ ^CGI$ ]] ; then
        echo "There is a CGI in the name"
    else
        echo "This shouldn't happen"
    fi
done

问题是针对每个文件,我得到This shouldn't happen。我知道正则表达式有问题,但我不知道如何解决。有什么建议么?

如果需要进一步解释,请告诉我。

最佳答案

正则表达式 ^CGI$ 仅在 整个 字符串为 CGI 时匹配。如果您想匹配任何子字符串,只需使用 CGI

这是因为在正则表达式中,^ 只匹配字符串的开头("anchors"到开头),$ 只匹配结尾。也就是说,这里更传统地使用 shell 样式模式(使用 = 运算符而不是 =~),并简单地使用通配符来禁用它们的隐式锚定。

最后,由于要通过变量查找来查找,所以需要使用变量间接寻址。所以:

varname=file$i
if [[ ${!varname} = *CGI* ]]; then
  echo "There is a CGI in the name"
fi

也就是说,更好的方法是使用数组。所以:

files=( CGInoimport doCGIimport donoCGInoimport importCGIno )
for file in "${files[@]}"; do
  [[ $file = *CGI* ]] && echo "There is CGI in the name $file"
done

...或者,如果键可以是非数字的或不连续的,则关联数组:

declare -A files=(
  [file1]=CGInoimport
  [file2]=doCGIimport
  [file3]=donocCGInoimport
  [file4]=importCGIno
)
for key in "${!files[@]}"; do
  [[ ${files[file$key]} = *CGI* ]] && echo "There is CGI in $key"
done

关于regex - 如何将字符串的一部分与 bash 中的正则表达式匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24831165/

相关文章:

linux - 如何在启动时运行终端命令

c - 如何在链表中保存和获取下一个和上一个数据?

Bash:来自命令输出的 grep 模式

bash - 在 Bash 中,我应该使用 declare 而不是 local 和 export 吗?

bash - 检查 stdout 或 stderr

c++ - 有关 C++ Boost::regex 的帮助

用于在匹配其他条件时排除单词的正则表达式习惯用法

java - # 个标签的正则表达式

java - 防止正则表达式过早捕获

java - ClassNotFoundException:BasicDataSourceFactory