终端Bash - 正则表达式不匹配

时间:2017-02-23 14:14:57

标签: bash

我正在使用Dropbox Uploader,我能够生成以下输出为$line的文件列表。我想部分匹配某些文件,但我不能让这个正则表达式工作。我在regexr.com上尝试过它可以工作,但用例不是

./dropbox_uploader.sh list | while read line
do
        if [[ $line =~ /person_(.*}?).sql/g ]];
        then
                echo "match";
        else
                echo "no match";
        fi
#echo "$line"
done

$list

的当前输出
> Listing "/"... DONE
[F] 168953708 person_02-15-2017_21-01-42.sql
[F] 170024815 person_02-17-2017_11-42-01.sql
[F] 170012760 person_02-17-2017_12-00-02.sql

上述预期输出

person_02-15-2017_21-01-42.sql
person_02-17-2017_11-42-01.sql
person_02-17-2017_12-00-02.sql

我基本上试图匹配具有文件名的行并输出该文件名。

3 个答案:

答案 0 :(得分:1)

你的正则表达式被破坏但我建议你不需要一个:

./dropbox_uploader.sh list | while read -r tag size file; do
    if [[ $file = person* ]]; then
        # do something with "$file"
    fi
done

这假定文件名始终从输出中的第三个字段开始,并且您没有使用文件名中的任何换行符。

如果需要,您可以使glob模式更具体,例如将person*更改为person*.sql

答案 1 :(得分:0)

如果您正在寻找更强大的正则表达式方法,请在bash中执行此操作,

while IFS= read -r line
do
    if [[ $line =~ .*person_([[:alnum:]|_|-]+)\.sql ]]; then
        printf "person_%s.sql\n" "${BASH_REMATCH[1]}"
    fi
done <file

生成结果

person_02-15-2017_21-01-42.sql
person_02-17-2017_11-42-01.sql
person_02-17-2017_12-00-02.sql

答案 2 :(得分:0)

  

我基本上试图匹配具有文件名的行并输出该文件名。

所以,你只需要这个(如果你的文件名不包含空格):

./dropbox_uploader.sh list | awk '/person_.*}?\.sql/{print $3}'

我在你的正则表达式中保留了可选的最终},但我真的看不出它的原因,因为.会匹配它。省略}?会产生完全相同的结果。

你试图在bash中匹配的正则表达式不起作用,因为bash不使用/分隔符和g修饰符。