2016-02-29 78 views
-2

素不相识 我想看看如果字符串在文件中的正则表达式匹配的Unix - 在文件匹配查找模式给定字符串

例如: 文件:

37|X|ari||ari????_test_V?|M|a.dat 
38|Y|ari||FEB2016_ranstong_V?|M|x.dat 
39|Z|ari||PA201606_outpop_V?|M|z.dat 

要搜索的字符串:ari2014_test_V1

结果:

37|X|ari||ari????_test_V?|M|a.dat 

有什么想法? 在此先感谢。

+2

'ari2014_test_V1'是** **不是由正则表达式'ARI ???? _ test_V匹配'。试试'echo'ari2014_test_V1'| grep'ari ???? _ test_V?'',你会看到它没有输出。一个与'ari2014_test_V1'相匹配的BRE正规表达式将会是'ari ...._ test_V.' - 这就是你想写的东西,或者你实际上是在尝试使用shell匹配模式(其中'?'匹配单个字符和'。 '是字面的)而不是正则表达式(其中'.'匹配单个字符,'?'表示前一个正则表达式段的零次或一次出现)?它对可能的解决方案有很大的影响。 –

回答

2

你可以用这个shell脚本:

kw='ari2014_test_V1' 

while read -r; do 
    IFS='|' read -ra arr <<< "$REPLY" 
    for v in "${arr[@]}"; do 
     [[ $kw == $v ]] && { echo "$REPLY"; break; } 
    done 
done < file 

37|X|ari||ari????_test_V?|M|a.dat 
+1

这适用于示例数据,但如果glob风格的正则表达式包含'*',则需要在'awk'预处理步骤中将其映射到'。*'。也许你需要将'[!a-z]'映射到'[^ a-z]'以获得shell否定的字符类。但是,这些不是当前样本数据所要求的。 –

+0

@AndreSimoes:它适合你吗? – anubhava