我有这段代码:
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}
)?
答案 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`