我正在使用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
我基本上试图匹配具有文件名的行并输出该文件名。
答案 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
修饰符。