如何在expr中进行非贪婪的匹配

时间:2016-04-04 19:17:27

标签: regex

我正在使用bash。我已尽力而为。它总是在regexr中工作。它适用于其他文件。对于一个文件,它无论如何都无法正常工作。我无法使用?使量词变得懒惰。我无法隔离dbsnp文件。请帮帮我!

vcfs=$(find . -type f -name "*\.vcf" -printf "%f\n")

echo "$vcfs"

>1000G_omni2.5.b37.vcf

>1000G_phase1.indels.b37.vcf

>1000G_phase1.snps.high_confidence.b37.vcf

>dbsnp_138.b37.vcf

>hapmap_3.3.b37.vcf

>Mills_and_1000G_gold_standard.indels.b37.vcf

thousandG=`expr "$vcfs" : '.*\(1000G_phase1.indels[^\n]*\.vcf\)'`

echo $thousand

>1000G_phase1.indels.b37.vcf

GoldStandard=`expr "$vcfs" : '.*\(Mills_and_1000G_gold_standard.indels[^\n]*\.vcf\)'`

echo $GoldStandard

>Mills_and_1000G_gold_standard.indels.b37.vcf

dbsnp=`expr "$vcfs" : '.*\(dbsnp_[1-9][3-9][3-9][^\n]*\.vcf\)'`

echo $dbsnp

>dbsnp_138.b37.vcf

>hapmap_3.3.b37.vcf

dbsnp=`expr "$vcfs" : '.*\(dbsnp_[1-9][3-9][3-9][^\n]*?\.vcf\)'`

echo $dbsnp

>

dbsnp=`expr "$vcfs" : '.*\(dbsnp_[1-9][3-9][3-9].*?\.vcf\)'`

echo $dbsnp

>

echo `expr "$vcfs" : '.*\(hapmap_[\n]*\.vcf\)'`

>hapmap_3.3.b37.vcf

1 个答案:

答案 0 :(得分:0)

来自expr的手册页:

  

STRING:REGEX        执行模式匹配。参数被强制转换为字符串        第二个被认为是(基本的,一个GNU` grep')        正则表达式

在基本的GNU grep正则表达式中,不支持非贪婪匹配修饰符。

考虑使用其他工具,例如sedawkgrep -P

在您的具体示例中(文件名中不会有换行符),您只需执行echo "$vcfs" |grep "^dbsnp_[1-9][3-9][3-9].*\.vcf"