Bash中过滤匹配foo*.yaml模式文件失败,求解决办法
解决bash中过滤GHA变更文件的问题
问题根源
你之前的方法无效主要有两个原因:
- 遍历带引号的文件名列表时,没有正确解析出不带引号的文件名,导致
file变量包含双引号,匹配模式foo*.yaml失败。 - grep正则表达式写错:
foo*\.yaml中的*是正则量词(匹配前一个字符o零次或多次),不是通配符的“任意字符”,无法正确匹配foo开头的文件名。
可行解决方案
方法1:正确解析文件名并遍历匹配
先把GHA输出的带引号字符串转换成bash数组,再用通配符匹配:
# 将带引号的输出转为bash数组(自动去除引号) eval "files=($steps.changed-files.outputs.all_changed_files)" # 遍历数组筛选符合条件的文件 for file in "${files[@]}"; do if [[ $file == foo*.yaml ]]; then echo "$file" fi done
注:eval会解析字符串中的引号,将每个文件名转为数组的独立元素,适合GHA输出的标准文件名格式(无特殊字符如$、`)。
方法2:用grep修正正则直接过滤
先解析文件名列表,再用正确的正则表达式匹配:
# 解析文件名并过滤 printf '%s\n' "$steps.changed-files.outputs.all_changed_files" | xargs -n1 | grep -E '^foo.*\.yaml$'
xargs -n1会自动处理引号,将每个文件名拆分为独立行。grep -E '^foo.*\.yaml$'用扩展正则:^foo匹配开头,.*匹配任意字符,\.yaml$匹配结尾,确保完整匹配文件名。
方法3:用awk处理(无需数组)
直接通过awk解析带引号的字符串并过滤:
echo "$steps.changed-files.outputs.all_changed_files" | awk -v RS=' "' '{ gsub(/^"|"$/, "") # 去除前后引号 if ($0 ~ /^foo.*\.yaml$/) print $0 }'
内容的提问来源于stack exchange,提问作者pkaramol
相关产品推荐
相关产品推荐

