1

我正在尝试从具有与正则表达式正确匹配的模式的文件列表中检查该值是否在我的数组中,如果没有,请附加它。

不幸的是,我在一些堆栈溢出帖子的启发下构建的这段代码不起作用(什么也没发生,=~ 似乎没有找到 bash_rematch,而且它也没有输出任何东西?

sample_array=() #creating the array
for context_files in data/*.txt.gz # checking all the different samples id we have
do 
    [[ $context_files =~ SL[0-9]{6} ]]
    echo 'context file:' "$context_files"
    
    echo 'rematch:' "${BASH_REMATCH[0]}"
    
    if ! [[ " ${sample_array[*]} " =~ (^|[[:space:]])"${BASH_REMATCH[0]}"($|[[:space:]])  ]]; then
        echo 'condition matched'
        echo 'rematch:' "${BASH_REMATCH[0]}"
        sample_array+=(" ${BASH_REMATCH[0]} ")
        
    fi
done
echo "${sample_array[*]}"

将此代码替换为

sample_array=() #creating the array
for context_files in data/*.txt.gz # checking all the different samples id we have
do 
    [[ $context_files =~ SL[0-9]{6} ]]
    echo 'context file:' "$context_files"
    
    echo 'rematch:' "${BASH_REMATCH[0]}"
    
    if ! [[ " ${sample_array[*]} " == "${BASH_REMATCH[0]}"  ]]; then
        echo 'condition matched'
        echo 'rematch:' "${BASH_REMATCH[0]}"
        sample_array+=(" ${BASH_REMATCH[0]} ")
        
    fi
done
echo "${sample_array[*]}"

这次将添加所有变量输出:

A B A B A B

我可能不知道如何管理 if 和/或如何在 bash 数组中进行正则表达式查找,但我很乐意得到一些帮助!

4

2 回答 2

1

第二场比赛被否定,所以要进入then部分,比赛需要失败。失败的匹配重置 $BASH_REMATCH。

#! /bin/bash
sample_array=()
for context_files in data/SL{111111,222222,333333,111111,222222}.txt.gz ; do 
    [[ $context_files =~ SL[0-9]{6} ]]
    match=${BASH_REMATCH[0]}
    echo 'context file:' "$context_files"
    echo 'rematch:' "$match"
    if ! [[ " ${sample_array[*]} " =~ (^|[[:space:]])"$match"($|[[:space:]])  ]]; then
        echo 'condition matched'
        echo 'rematch:' "$match"
        sample_array+=(" $match ")
        
    fi
done
echo "${sample_array[*]}"
于 2021-01-25T18:37:22.877 回答
0

这是 bash 风格的完全替代解决方案,如 John Kugelman 建议的:

printf %s\\n data/*.txt.gz | grep -Eo 'SL[0-9]{6}' | sort -u

如果您需要数组中的结果,请使用mapfile

mapfile -t array <(printf %s\\n data/*.txt.gz | grep -Eo 'SL[0-9]{6}' | sort -u)
于 2021-01-25T18:43:31.763 回答