Regex 从bash变量中提取数字

Regex 从bash变量中提取数字,regex,bash,variables,digits,Regex,Bash,Variables,Digits,我有以下代码: for a in `ls *w.txt`; do perl getSequenceNs.pl $a /home/prenos/medicago/${a:0:1}.NOLE.fas >sequences/${a}_sequence.txt; done 除非我认识到,${a:0:1}从$a中提取第一个数字,否则它一直工作得很好,不幸的是,有时有两个数字 因此,我的变量$a包含: dsomeletters <-one digit and letters, for exam

我有以下代码:

for a in `ls *w.txt`; do perl getSequenceNs.pl $a /home/prenos/medicago/${a:0:1}.NOLE.fas >sequences/${a}_sequence.txt; done
除非我认识到,${a:0:1}从$a中提取第一个数字,否则它一直工作得很好,不幸的是,有时有两个数字

因此,我的变量$a包含:

dsomeletters <-one digit and letters, for example 1.NOLE.fas

ddsomeletters <-two digits and letters, for example 12.NOLE.fas

dsomeletters文件名的字母部分是否始终一致?如果是这样,您可以通过使用
basename
来避免问题:

NAME=`basename $a .NOLE.fas`

文件名的字母部分是否始终一致?如果是这样,您可以通过使用
basename
来避免问题:

NAME=`basename $a .NOLE.fas`
你应该做你想做的。这实际上是一种巴什主义,因此您可能更喜欢更便携的:

${a%%[^0-9]*}
你应该做你想做的。这实际上是一种巴什主义,因此您可能更喜欢更便携的:

${a%%[^0-9]*}

首先,不要解析
ls
,只需glob就能正确处理丑陋的字符。现在,您可以使用
bash
string操作来获取数字:

$ var=123abc456def
$ echo ${var%%[^0-9]*}
123
$ echo ${var//[^0-9]*/}
123
请注意,
*
这里不是通常的0+重复,它是全局的。这两种模式都从字符串末尾的第一个非数字字符中删除。因此,您的最终命令应如下所示:

for a in *w.txt; do perl getSequenceNs.pl "$a" /home/prenos/medicago/${a%%[^0-9]*}.NOLE.fas >"sequences/${a}_sequence.txt"; done

首先,不要解析
ls
,只需glob就能正确处理丑陋的字符。现在,您可以使用
bash
string操作来获取数字:

$ var=123abc456def
$ echo ${var%%[^0-9]*}
123
$ echo ${var//[^0-9]*/}
123
请注意,
*
这里不是通常的0+重复,它是全局的。这两种模式都从字符串末尾的第一个非数字字符中删除。因此,您的最终命令应如下所示:

for a in *w.txt; do perl getSequenceNs.pl "$a" /home/prenos/medicago/${a%%[^0-9]*}.NOLE.fas >"sequences/${a}_sequence.txt"; done

谢谢,但是我是bash初学者,所以我尝试使用这个vere没有成功。谢谢,但是我是bash初学者,所以我尝试使用这个vere没有成功。