Bashのls出力から小数点を持つ数値抽出

Bashのls出力から小数点を持つ数値抽出

Ubuntu 14.04.1 64ビットLTSのBashから「hsli」で始まり、「.h5」で終わるファイル名の数値部分を抽出したいと思います。私のls -l hsli*結果は次のとおりです。

-rwxrwxrwx 1 ongun ongun 31392 Feb 26 13:04 hsli0.03.h5
-rwxrwxrwx 1 ongun ongun 31392 Feb 26 13:44 hsli0.042.h5
-rwxrwxrwx 1 ongun ongun 31392 Feb 26 14:24 hsli0.054.h5
-rwxrwxrwx 1 ongun ongun 31392 Feb 26 15:03 hsli0.066.h5
-rwxrwxrwx 1 ongun ongun 31392 Feb 26 15:42 hsli0.078.h5
-rwxrwxrwx 1 ongun ongun 31392 Feb 26 16:22 hsli0.09.h5
-rwxrwxrwx 1 ongun ongun 31392 Feb 26 17:02 hsli0.102.h5
-rwxrwxrwx 1 ongun ongun 31392 Feb 26 17:36 hsli0.114.h5
-rwxrwxrwx 1 ongun ongun 31392 Feb 26 17:58 hsli0.126.h5
-rwxrwxrwx 1 ongun ongun 31392 Feb 26 18:20 hsli0.138.h5
-rwxrwxrwx 1 ongun ongun 31392 Feb 26 18:42 hsli0.15.h5

それらはすでに昇順になっており、少し操作した後に次のコマンドを使用して最初のファイルのファイル名を取得できます。コマンドと出力は次のとおりです。

$ ls -l hsli* | head -1 | rev | cut -f 1 -d " " | rev 
hsli0.03.h5

今私の目標はここから抽出することです0.03。どうすればいいですか?正規表現に慣れておらず、ファイル名に2つの点があり、難しい状況のようです。

ベストアンサー1

そうでない場合は、lsとにかくリストをシェルグローブで埋めることになるので、次のようにブローカーを削除できます。

glob_hsli()(IFS=.;set +f
    set -f -- '' hsli*.*.h5
    for h5 do case ${h5#*.}  in
        (*[!0-9]*.*|.*|'') : ;;
        (*) set $h5 "${1:-0}";
        shift $((3>>($2>$4)));;
    esac;done
    printf "0.%d\n" "${1:?No Match Found!}"
)

引数なしで呼び出すと、ファイルがグローバル化され、hsli*現在のディレクトリ結果の中央部分の最初の部分のみが印刷されます。それ以外の場合はエラーを返し、stderrに意味のあるエラーメッセージを出力します。*.string.h5

おすすめ記事