Bash 中带有字符、点和数字的正则表达式

Posted

技术标签:

【中文标题】Bash 中带有字符、点和数字的正则表达式【英文标题】:Regex with characters, dots and numbers in Bash 【发布时间】: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

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

非常感谢。

【问题讨论】:

尝试转义点两次。 很遗憾,它不起作用。 是的,基本上这就是问题所在。非常感谢! 【参考方案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]+$

【讨论】:

以上是关于Bash 中带有字符、点和数字的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

只有数字、点和最小值的正则表达式

确定字符串是不是是Java中带有正则表达式的URL [重复]

使用正则表达式仅获取某个字符(#)之后的数字[关闭]

使用 linux 和 AIX 的正则表达式替换 bash 脚本中的字符串

如何使这个正则表达式也接受小数

JavaScript 正则表达式,用于带有一个点和 2 个小数的正数