1

我有这个代码:

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

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

4

3 回答 3

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

应该做你想做的。这实际上是一种 bashism,因此您可能更喜欢更便携的:

${a%%[^0-9]*}
于 2012-04-18T16:54:41.743 回答
3

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

$ var=123abc456def
$ echo ${var%%[^0-9]*}
123
$ echo ${var//[^0-9]*/}
123

请注意,*这里不是通常的 0+ 重复,它是 globbing。两种模式都从不是数字的第一个字符到字符串末尾删除。所以你的最终命令应该是这样的:

for a in *w.txt; do perl getSequenceNs.pl "$a" /home/prenos/medicago/${a%%[^0-9]*}.NOLE.fas >"sequences/${a}_sequence.txt"; done
于 2012-04-18T16:55:23.743 回答
1

文件名的字母部分是否始终一致?如果是这样,您可以使用以下方法避免该问题basename

NAME=`basename $a .NOLE.fas`
于 2012-04-18T16:43:17.190 回答