数値ファイル拡張子とのみ一致する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]のみを使用してください。