シェルでの正規表現

シェルでの正規表現

シェル内で正規表現を使用する方法について 2 つの質問があります。

1. *の使用

によると正規表現に関するWikipediaのページ:

*: アスタリスクは、先行する要素が 0 個以上あることを示します。たとえば、ab*c は「ac」、「abc」、「abbc」、「abbbc」などに一致します。

しかし、と書くとrm test*.iso、「test」で始まり「.iso」で終わるすべてのファイルが削除されます。「test」と「.iso」の間にあるかどうかは関係ありません。つまり、「tes.iso」というファイルはない削除されました。

abc の例を挙げると、Wikipedia によれば、「ab*c」は「ac」と一致します。したがって、rm ab*c「ac」ファイルを削除する必要があります。なぜ rm は Wikipedia で説明されているように正規表現を使用しないのでしょうか?

2. - と ? の使用

それでも、正規表現に関するWikipediaのページ:

?: 疑問符は、先行する要素が 0 個または 1 個あることを示します。たとえば、colou?r は「color」と「colour」の両方に一致します。

+: プラス記号は、先行する要素が 1 つ以上あることを示します。たとえば、ab+c は「abc」、「abbc」、「abbbc」などと一致しますが、「ac」とは一致しません。

「?」は「*」のように機能するようです。つまり、「?」記号は 1 つまたは 0 つの要素を置き換えます (ただし、Wikipedia の説明とは逆に、前の要素は置き換えません)。

「+」の使い方がわかりません。これが 2 つ目の質問です。正規表現やに関するトリックにも興味がありますrm, cp, ...

答え1

シェルのパターンマッチング表記は、この標準文書

ドキュメントの冒頭で述べられているように、パターン マッチング表記法は正規表現表記法と関連していますが、若干異なります。

特に、?シェルでは は.正規表現のように動作し、*シェルでは は.*正規表現のように動作します。(ただし、どちらも.ファイル名の先頭の には一致しません。)+シェルには特別なパターン マッチング機能はありません。ただし、@HaukeLaging が回答で述べているように、特定のシェルではオプションで正規表現表記を有効にすることができますが、これは非標準です。

答え2

シェルは特定の条件下でのみ正規表現を使用します (これはシェルごとに異なる可能性があります)。

bash以下の方法でアクティブ化する必要があります:shopt -s extglob

その後は次のようなものを使用できます:

echo a*(b)c

Pattern Matchingのブロックを参照してくださいman bash

関連情報