findコマンドの正規表現にハイフンがないのはなぜですか?

findコマンドの正規表現にハイフンがないのはなぜですか?

-たとえば、ファイル名にハイフンがあるファイルを識別するには、正規表現と組み合わせたコマンドが一致しないようですtest-19.1.txtfind

コマンドはfind . -maxdepth 1 -regextype posix-egrep -regex '.*/[a-z0-9\-\.]+\.txt' -exec echo {} \;bashシェルで実行されましたが、そのファイルが見つかりませんでした。ファイル名からハイフンが削除されると、正規表現が一致します。

テスト時に同じ正規表現を使用してください。regexr.com成功しました。

答え1

文字クラスにハイフンを含めるには、ハイフンを最初または最後の位置にする必要があります。

~からマニュアルを探す 「GNU Emacsで使用されているものとほぼ同じ正規表現型を見つけて見つけます。」そしてからEmacs マニュアル:

  • [ ... ]
    • を含めるには、グループの最初または最後の文字として書き込むか、‘-’範囲‘-’の後に配置します。したがって‘[]-]’、一致する‘]’‘-’

したがって、正規表現は次のようになります。'.*/[a-z0-9.-]+\.txt'

POSIX BRE と ERE では同じルールが適用されます。

<hyphen-minus>文字は、リスト内の最初(存在する場合は最初の文字の後)、または最後に現れる場合はそれ自体で処理されるか、または範囲式の終了範囲ポイントとして処理されます。'^'たとえば、式"[-ac]""[ac-]"同じです'a'。とを除くすべての文字と一致します。式はとの間のすべての文字と一致します。POSIX ロケールでは、対応する文字が記号の後にあるため、有効または等価です。 aを開始範囲ポイントとして使用するには、角かっこ式で最初に出現するか、組み合わせ記号として指定する必要があります。たとえば、aまたはすべての文字、または0と0(0を含む)の間でソートするソート要素と一致します。'c''-'"[^-ac]""[^ac-]"'a''c''-'"[%--]"'%''-'"[--@]"'-''@'"[a--@]"'@''a''-'<hyphen-minus>"[][.-.]-0]"<right-square-bracket><hyphen-minus>

角かっこ式がとの両方'-'を指定する場合は、角かっこ式の最初(存在する場合)と最後に']'配置']'する必要があります。'^''-'

一般的な表現

実際、ほとんどの正規表現バリアントではハイフン一致規則が同じです。

ハイフンは、開いたかっこの直後、閉じ括弧の前、または否定されたカラットの後に来ることができます。[-x]どちらも[x-]x またはハイフンと一致します。 xやハイフンではないすべての文字[^-x]と一致します。[^x-]これは、このチュートリアルで説明されているすべてのスタイルに適用されます。範囲を形成できない文字クラスの他の場所にあるハイフンは、リテラルまたはエラーとして解釈できます。正規表現スタイルはこれと非常に一致しません。

文字クラスまたは文字セット

答え2

努力する。

find . -maxdepth 1 -regextype posix-egrep -regex '.*/[a-z0-9.-]+\.txt'

角かっこ式内で:

  • ダッシュには特別な意味があります。範囲。この特別な意味は、ダッシュが始まり(オプションの^場合は使用されている場合は次のもの)または終わりにある場合にのみ回避できます。
  • 通常、バックスラッシュは次の文字をエスケープせず、リテラルです\。具体的には、エスケープポイントを必要とせず、-バックスラッシュを使用してダッシュ()の特別な意味をエスケープする方法はありません。

[a-z0-9\-\.]したがって、あなたが書いたものは〜(または単に)範囲として理解されます。\\\

関連情報