回答:
どうですか:
ls *[!0-9][0-9].txt
!グループの先頭には、その意味を補完します。
コメントに記載されているように、これはbashの機能です。たとえば、次のことを試してください。
printf "%s\n" *[!0-9][0-9].txt
ls)は正規表現をサポートしないことに注意してください。これらはファイル名式(Globbing)です。あなたはすでにあなたの例で違いを見ることができます:ここに*、ワイルドカードがありますが、これは正規表現にはありません.*。正規表現は、グロビングよりもはるかに強力です。
質問は正規表現を求めました。Bash、したがってls、ここでは正規表現をサポートしていません。サポートするのは、ワイルドカードの形式であるファイル名式(Globbing)です。正規表現はそれよりもはるかに強力です。
本当に正規表現を使用したい場合は、次のfind -regexように使用できます。
find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt'
Findはデフォルトでは再帰的ですが、そうでlsはありません。現在のディレクトリでのみファイルを検索するには、で再帰を無効にできます-maxdepth 1。パスを含むファイル名と一致./するものを検索し.ます。そのため、でfindを実行した場合、ファイル名はで始まります。正規表現はそれ\./に対処するために始まります。正規表現で.は、任意の文字に一致する特殊文字ですが、ここではドットが本当に必要であることに注意してください。そのため、バックスラッシュでエスケープします。.txtそうでない場合は正規表現も一致するため、ドットドットについても同じことを行いAtxtます。数字クラスはグロビングの場合と同じですが、文字クラスを反転する^代わりに必要なだけです!。
の出力を取得する場合はls、次の-exec lsように使用できます。
find . -maxdepth 1 -regex '\./.*[^0-9][0-9]\.txt' -exec ls -lah {} \;
findいくつかの異なる正規表現フレーバーをサポートします。-regextypeたとえば、を指定できます。
find . -maxdepth 1 -regextype egrep -regex '\./.*[^0-9][0-9]\.txt'
私にとって可能なタイプは、「findutils-default」、「awk」、「egrep」、「ed」、「emacs」、「gnu-awk」、「grep」、「posix-awk」、「posix-basic」です。 、「posix-egrep」、「posix-extended」、「posix-minimal-basic」、「sed」を実行find -regextype helpすると、システムでサポートされているものを確認できます。
kshがグロブ(または拡張してbash -O extglobか、zsh -o kshglob既に使用していること)を、それは次のようになります。
ls -d -- ?(*[![:digit:]])[[:digit:]].txt
または
ls -d -- !(*[[:digit:]])[[:digit:]].txt
あなたは上で一致させたい場合a1.txt と2.txtではなく、a12.txtも12.txt。
ただし、kshとbash(failglobzshに似た動作をするオプションを設定しない限り)では、そのパターンがどのファイルとも一致しない場合、パターンは文字通りに渡されls、その(奇妙な名前の)ファイルが存在する場合、lsパターン自体に一致しない場合でもリストされます。
含めるには.2.txt、セットdotglob内のオプションbashの追加、(D)グロブで修飾子zsh、またはセットをFIGNOREする!(.|..)中をksh93。
shopt -s extglob。