Bash:文件中的变量匹配正则表达式

Bash:文件中的变量匹配正则表达式

我的脚本如下:

  1. 搜索某个路径下所有可用的 isos
  2. 将 isos 名称与文件中的列表进行比较
  3. 仅返回匹配项

简而言之,代码是:

isos_found=() # here we save the isos
isos_search=<find isos>
mapfile -t supported_isos < supported_systems # see below
for iso in "${isos_search[@]}" ; do
  [[ "${supported_isos[@]}" =~ "$(basename "$iso")"  ]] && isos_found+=("$iso")
done

supported_systems包含以下内容的文件在哪里:

clonezilla-live-2.6.1-25-amd64.iso
debian-live-10.0.0-amd64-xfce+nonfree.iso
linuxmint-19.1-cinnamon-64bit.iso
linuxmint-19.1-xfce-32bit.iso
lubuntu-18.04-alternate-amd64.iso

现在我希望该文件supported_systems的内容如下:

clonezilla*
debian*
linuxmint*
lubuntu*

因此,我必须仅匹配发行版的名称,而无需对每个版本/发行版进行编码。

使用与上面类似的代码 ( "${supported_isos[@]}" =~ "$(basename "$iso")") 这可能吗?如果没有,我愿意接受建议。

答案1

假设您的supported_systems文件包含前缀字符串(不是模式)就像

clonezilla
debian
linuxmint
lubuntu

然后,您可以简单地读取这些字符串并在文件全局匹配中使用它们,而不是首先尝试查找所有 ISO 文件,然后手动检查它们是否匹配某些模式。

shopt -s dotglob nullglob globstar

isos=()
while IFS= read -r prefix; do
        isos+=( ./**/"$prefix"-*.iso )
done <supported_systems

printf '%s\n' "${isos[@]}"

如果您确实想先查找所有 ISO 文件,然后遍历它们以查找与任何前缀匹配的文件,那么您可以使用

shopt -s dotglob nullglob globstar

isos=( ./**/*.iso )
while IFS= read -r prefix; do
        for iso in "${isos[@]}"; do
                if [[ $iso =~ /"$prefix"-[^/]*$ ]]; then
                        matched_isos+=( "$iso" )
                fi
        done
done <supported_systems

printf '%s\n' "${matched_isos[@]}"

在这里,正则表达式/"$prefix"-[^/]*$将匹配以给定$prefix(后跟-)开头的任何基本名称。

相关内容