web-dev-qa-db-ja.com

ハイフン記号がなぜfindコマンドの正規表現で発見できないのですか?

-などのファイル名にハイフン記号test-19.1.txtが含まれているファイルを識別するために、正規表現と組み合わせたfindコマンドは一致していないように見えます。

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

regexr.com でテストすると、同じ正規表現が成功します。

5
Ryan

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

find manual "から検索と検索で使用される正規表現のタイプは、GNU Emacs"および Emacsマニュアル から:

  • [ ... ]
    • ‘-’を含めるには、セットの最初または最後の文字として‘-’を書き込むか、範囲の後に置きます。したがって、‘[]-]’‘]’‘-’の両方に一致します。

したがって、正規表現は'.*/[a-z0-9.-]+\.txt'である必要があります

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

<hyphen-minus>文字は、それが最初に(最初の'^'があれば)後に、またはリスト内で最後に出現する場合はそれ自体として、または範囲式の終了範囲ポイントとして処理されます。例として、式"[-ac]""[ac-]"は同等であり、'a''c'、または'-'のいずれかの文字と一致します。 "[^-ac]""[^ac-]"は同等であり、'a''c'、または'-'を除くすべての文字と一致します。式"[%--]"は、'%''-'の間の任意の文字に一致します。式"[--@]"は、'-''@'の間の任意の文字に一致します。また、式"[a--@]"は無効であるか、'@'と同等です。これは、POSIXロケールでは、文字'a'が記号'-'に続くためです。 <hyphen-minus>を開始範囲ポイントとして使用するには、ブラケット式の最初に来るか、照合記号として指定する必要があります。たとえば、"[][.-.]-0]"は、<right-square-bracket>または<hyphen-minus>と0の間で照合する任意の文字または照合要素のいずれかに一致します。

ブラケット式が'-'']'の両方を指定している場合、']'が最初に(もしあれば'^'の後に)配置され、'-'はブラケット式。

正規表現

実際、ほとんどの正規表現の変形には、ハイフンを照合するための同じルールがあります。

ハイフンは、開始ブラケットの直後、終了ブラケットの直前、または否定キャレットの直後に含めることができます。 [-x][x-]はどちらもxまたはハイフンに一致します。 [^-x]および[^x-]は、xまたはハイフン以外の任意の文字に一致します。これは、このチュートリアルで説明するすべてのフレーバーで機能します。 文字クラスの他の位置にあるハイフンは、範囲を形成できないため、リテラルまたはエラーとして解釈される場合があります。正規表現のフレーバーはこれについてかなり一貫していません。

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

15
phuclv

試してみてください。

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

括弧式の内側:

  • ダッシュは範囲の特別な意味を持っています。その特別な意味は、ダッシュが開始位置(オプションの^の後、使用されている場合)または終了位置にある場合にのみ回避されます。
  • 通常、バックスラッシュは次の文字をエスケープせず、リテラル\です。特に、ドットをエスケープする必要はなく、ダッシュ(-)の特別な意味をバックスラッシュでエスケープする方法もありません。

したがって、[a-z0-9\-\.]は、\から\までの範囲(または単に\)として解釈されます。

4
Isaac