【问题标题】:Regex with characters, dots and numbers in BashBash 中带有字符、点和数字的正则表达式
【发布时间】:2017-10-23 13:59:38
【问题描述】:

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

>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

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

非常感谢。

【问题讨论】:

  • 尝试转义点两次。
  • 很遗憾,它不起作用。
  • 是的,基本上这就是问题所在。非常感谢!

标签: regex bash


【解决方案1】:

第一个问题是使用[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}$'

【讨论】:

  • 既然有重复的部分,我们可以用一个量词hceregex='^&gt;chr[0-9]+(\.[0-9]+){4}$
  • 非常感谢。没有猫也应该更快。这部分代码将包含在一个更大的代码中,并且头文件将有数千个头文件需要检查。
【解决方案2】:

在你的文本中你有零,这里是24407,但在正则表达式中不是[1-9]+,你必须将它更新为:

^>chr[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 2022-07-01
    相关资源
    最近更新 更多