3

bash スクリプトでファイル拡張子の前の最後の番号を抽出しようとしています。そのため、形式はさまざまですが、数字と文字の組み合わせになり、最後の文字は常に数字になります。これらの数字を取り出して変数に格納する必要があります。

形式は一般的に次のとおりです。

sdflkej10_sdlkei450_sdlekr_1.txt

最後の桁の 1 だけを変数に格納したい。

これを使用して多数のファイルをループすると、最後の数字が 2 桁または 3 桁になります。

したがって、このファイルの場合:

kej10_sdlkei450_sdlekr_310.txt

310を返す必要があります。

英数字とアンダースコアの数はファイルごとに異なりますが、私が常に欲しい数は.txt拡張子の直前とアンダースコアの直後です。

私は試した:

bname=${f%%.*}
number=$(echo $bname | tr -cd '[[:digit:]]') 

しかし、これはすべての数字を返します。

私が試したら

number = $(echo $(bname -2) it changes the number it returns.

私が抱えている問題は、主に可変性に関連しており、bash でそれを行うように求められているという事実です。どんな助けでも本当に感謝します。

4

5 に答える 5

1

一連の Bash シェル拡張を使用する

最も洗練されたソリューションではありませんが、これは一連のシェル パラメーター展開を使用して、特定の拡張機能を定義することなく目的の結果を達成します。たとえば、次の関数は、長さとオフセットの拡張を使用して、ファイル名の拡張子を削除した後に数字を見つけます。

extract_digit() {
    local basename=${1%%.*}
    echo "${basename:$(( ${#basename} - 1 ))}"
}

関数出力のキャプチャ

次のような変数で出力をキャプチャできます。

$ foo=$(extract_digit sdflkej10_sdlkei450_sdlekr_1.txt)
$ echo $foo
1

関数からのサンプル出力

$ extract_digit sdflkej10_sdlkei450_sdlekr_1.txt
1

$ extract_digit sdflkej10_sdlkei450_sdlekr_9.txt
9

$ extract_digit sdflkej10_sdlkei450_sdlekr_10.txt
0
于 2013-09-03T18:09:36.600 に答える