数値ファイル拡張子のみ一致

数値ファイル拡張子のみ一致

数値ファイル拡張子とのみ一致するUNIXパターンを見つけようとします。たとえば、次のようになります。

  • ファイル1
  • ファイル.2
  • 文書1.1
  • 5ファイル2.52
  • ファイル。25938

ちょっと待って、そうではありません。

  • ファイル1.0.ext
  • ファイル4.csv
  • 6ファイル5.5.2.ext
  • File.1s
  • ファイル.s134

これは簡単だと思いましたが、理解できないようです。試してみました。

  • *.[0-9]* は file1.0.csv と一致します。
  • *.[0.9]*/> はどんなものとも一致しません。

私が何を見逃しているかを知っている専門家がありますか?私の考えでは、//単語の終わりに一致すると思います。

編集 - 説明:私はUnixシェルスタイルのワイルドカードを使用するモジュールを使用してPythonでコーディングしているので、そのワイルドカードにのみアクセスできます。

答え1

そしてzsh

echo file.<->

<-><x-y>like の特殊な形式ですが、<1-100>制限なくすべての正の 10 進数 (空でない 10 進数のシーケンス) と一致します。または、次のextendedglobオプションを使用します。

echo file.[0-9]##

##+拡張正規表現演算子と同じです。

以下と一緒に、kshまたはbash -O extglob(またはshopt -s extglob以内bash)またはzsh -o kshglob(またはsetopt kshglob以内zsh):

echo file.+([0-9])

繰り返しますが、+(x)EREと同じですx+

ksh93また、そのglobでEREを使用することもできます。

echo ~(E).*\.[0-9]+$

.*必ずしも必要ではなく、この機能がないと~(E)\.[0-9]+$隠されたファイルも一致します。)

標準グローブに該当するものはありません。彼らが持っているものは次のとおりです。

  • *必要な数の文字と一致
  • ?単一文字と一致
  • [criteria]一致する文字と一致基準

リストをポストフィルタリングする必要があります。たとえば、次のようになります。

set -- *.*[0-9]
for i do
  case ${i##*.} in
    (*[!0-9]*) ;;
    (*) set -- "$@" "$i"
  esac
  shift
done
echo "$@"

つまり、aを含み、数字で終わるファイル名のリストから、.最後の部分に.数字以外のファイル名を含むファイル名を除外します。

答え2

Bashで($f検証するファイル名を含む場合):

[[ "${f##*.}"  == +([0-9]) ]] && echo "Yes" || echo "No"

ここでは"${f##*.}"、最後の拡張子(最後の点の後ろ)を選択し、
数字+([0-9])のみに一致する拡張正規表現です。

ファイル名のリスト(内部的にinfile)を処理するサンプルスクリプトは次のとおりです。

#!/bin/bash
while read f; do
    printf 'file %-15s ----> %7s ==> ' "$f" "${f##*.}"
    if     [[ "${f##*.}"  == +([0-9]) ]]
    then   echo "Yes"
    else   echo "No"
    fi
done <"infile"

任意の出力:

file file.1          ---->       1 ==> Yes
file file.2          ---->       2 ==> Yes
file file1.1         ---->       1 ==> Yes
file 5file2.52       ---->      52 ==> Yes
file file.25938      ---->   25938 ==> Yes
file NOT             ---->     NOT ==> No
file file1.0.ext     ---->     ext ==> No
file file4.csv       ---->     csv ==> No
file 6file5.5.2.ext  ---->     ext ==> No
file file.1s         ---->      1s ==> No

より単純な(UNIX)シェルを使用して克服する必要がある主な障害は、正規表現を理解して実行(拡張)するユーティリティを見つけることです。

「拡張正規表現」を試すことができますsed

[ "$(echo "${f##*.}" | sed -nE 's/^([0-9]+)$/\1/p')" ] && echo "Yes" || echo "No"

あるいは、sedでも「デフォルト正規表現」を使用できます。

[ "$(echo "${f##*.}" | sed -n 's/^\([0-9]\{1,\}\)$/\1/p')" ] && echo "Yes" || echo "No"

または(Solarisおよび他のオペレーティングシステムにexpr変更する必要があるかもしれません):\+\{1,\}

expr "${f##*.}" : '^\([0-9]\+\)$' >/dev/null && echo "Yes" || echo "No"

でもawk:

[ $( echo "${f##*.}" | awk '/^[0-9]+$/' ) ] && echo "Yes" || echo "No"

答え3

Pythonマッチ指定されたファイル "glob"型引数をPython正規表現(re)に変換するために使用したいモジュールですが、 "+"演算子を私が望む方法で処理しません。 reによってエスケープされたようです。 escape()(私のシステムのPython 2.6でfnmatchのソースコードを確認してください)

ついに、

fnmatch.filter(['file.007'], '*.[0-9]+')

するいいえ期待どおりに動作しますが、

fnmatch.filter(['file.7'], '*.[0-9]')

一致を提供します。

同様に

 fnmatch.filter(['file.007'], '*.[0-9]{1,}')

いいえ。

答え4

ファイルが数字で終わるので*[0-9]のみを使用してください。

関連情報