从bash变量中提取数字

时间:2012-04-18 16:37:24

标签: 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 example 1.NOLE.fas

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

如何只提取数字?我应该如何修改我的代码(我应该使用什么而不是${a:0:1})?

3 个答案:

答案 0 :(得分:3)

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

应该做你想做的事。这实际上是一种基础,所以你可能更喜欢便携式:

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

答案 1 :(得分:3)

首先,不要解析ls,只有glob会做并正确处理丑陋的字符。现在,您可以使用bash字符串操作来获取数字:

$ 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

答案 2 :(得分:1)

文件名的字母部分是否始终一致?如果是这样,您可以使用basename

来避免此问题
NAME=`basename $a .NOLE.fas`