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='^>chr[0-9]+(\.[0-9]+)4$
非常感谢。没有猫也应该更快。这部分代码将包含在一个更大的代码中,并且头文件将有数千个头文件需要检查。【参考方案2】:
在你的文本中你有零,这里是24407
,但在正则表达式中不是[1-9]+
,你必须将它更新为:
^>chr[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$
【讨论】:
以上是关于Bash 中带有字符、点和数字的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章
确定字符串是不是是Java中带有正则表达式的URL [重复]