我试图找到一个正则表达式,它将检查以下模式:
>chr28.1.1.24407.24473
因此,这个模式由5个由点分隔的部分组成。第一部分是字符串“> chr”后跟一个数字(一个或多个数字),所有其他部分应该是带有一个或多个数字的数字。 这个正则表达式应该是一个小脚本的一部分,它首先找到这些行,然后检查它们的验证。
HCE=$1
hceregex='^>chr[1-9]+\.[1-9]+\.[1-9]+\.[1-9]+\.[1-9]+$'
grep ">" $HCE > HCE.headers
file="HCE.headers"
lines=`cat $file`
for line in $lines
do
if [[ ! $line =~ $hceregex ]]
then
echo "Invalid fasta header in HCE sequence. Check the G-Anchor manual for the headers format"
exit 1
else
echo "Brilliant!!!!"
fi
done
我的问题是没有点的转义字符的正则表达式返回所有标题。通过使用转义字符,它排除了所有内容,甚至是正确的内容。 我做错了什么?
非常感谢提前。
答案 0 :(得分:3)
第一个问题是使用[1-9]
,它只匹配数字1-9
。您应该使用[0-9]
来匹配任何数字。
第二个问题是使用不必要的cat
和不带引号的变量。您应该使用此代码:
hceregex='^>chr[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$'
while read -r line; do
if [[ ! $line =~ $hceregex ]]; then
echo 'Invalid fasta header in HCE sequence'
else
echo 'Brilliant!!!!'
fi
done < file
作为进一步优化,您可以将正则表达式缩短为:
hceregex='^>chr[0-9]+(\.[0-9]+){4}$'
答案 1 :(得分:1)
在您的文字中,您有零,[1-9]+
但在正则表达式^>chr[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$
中,您必须将其更新为:
{{1}}