正则表达式中包含Bash中的字符,点和数字

时间:2017-10-23 13:59:38

标签: regex bash

我试图找到一个正则表达式,它将检查以下模式:

>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

我的问题是没有点的转义字符的正则表达式返回所有标题。通过使用转义字符,它排除了所有内容,甚至是正确的内容。 我做错了什么?

非常感谢提前。

2 个答案:

答案 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}}