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 から最初の桁を抽出し、残念ながら 2 桁ある場合があることを認識しない限り、非常にうまく機能しています。

したがって、私の変数 $a には以下が含まれます。

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

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

数字だけを抽出するにはどうすればよいですか? コードをどのように変更すればよいですか ( の代わりに何を使用すればよい${a:0:1}ですか?)

4

3 に答える 3

3

まず、 parse を行わないでください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
于 2012-04-18T16:55:23.743 に答える
3
${a//[^0-9]*} 

あなたがしたいことをするべきです。それは実際にはバシズムなので、より移植性の高いものを好むかもしれません:

${a%%[^0-9]*}
于 2012-04-18T16:54:41.743 に答える
1

ファイル名の文字部分は常に一貫していますか?もしそうなら、あなたは使用することによって問題を回避することができますbasename

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