2012-04-18 3 views
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 

Она работает довольно хорошо, если я не узнал, что $ {а: 0: 1} извлекает первую цифру от $ а и, к сожалению, иногда бывают два.

Итак, мои переменные $ а содержит:

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

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

Как я могу извлечь только цифры? Как мне изменить свой код (что я должен использовать вместо ${a:0:1})?

ответ

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

должен делать то, что вы хотите. То есть на самом деле bashism, так что вы можете предпочесть более портативный:

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

спасибо, вот и все, просто и понятно – Perlnika

1

Является ли последовательность писем в имени файла неизменной? Если да, то вы могли бы избежать проблем с помощью basename:

NAME=`basename $a .NOLE.fas` 
+0

Спасибо, но я начинаю bash, поэтому мои попытки использовать это не были успешными. – Perlnika

3

Во-первых, не разобрать ls, только Глоб будет делать и правильно обрабатывать уродливые символы. Итак, вы можете использовать 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 
+0

спасибо за совет с ls – Perlnika

Смежные вопросы