的Unix - 在文件匹配查找模式给定字符串
问题描述:
素不相识 我想看看如果字符串在文件中的正则表达式匹配的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
有什么想法? 在此先感谢。
答
你可以用这个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
'ari2014_test_V1'是** **不是由正则表达式'ARI ???? _ test_V匹配'。试试'echo'ari2014_test_V1'| grep'ari ???? _ test_V?'',你会看到它没有输出。一个与'ari2014_test_V1'相匹配的BRE正规表达式将会是'ari ...._ test_V.' - 这就是你想写的东西,或者你实际上是在尝试使用shell匹配模式(其中'?'匹配单个字符和'。 '是字面的)而不是正则表达式(其中'.'匹配单个字符,'?'表示前一个正则表达式段的零次或一次出现)?它对可能的解决方案有很大的影响。 –