シェルパターンマッチングと正規表現の出現

シェルパターンマッチングと正規表現の出現

私はUnixに初めて触れ、偶然に好奇心を見つけました。一部のシェル構成(caseまたはfind)はパターンマッチングを使用しますが、正確に正規表現ではありません。ed、 などの他のコマンドは、 sedパターンマッチングに正規表現を使用します。正規表現を使用するシェルコマンド(組み込み、プログラム)とは異なる種類のパターンマッチングを使用するコマンドを一覧表示できますか?viawk

答え1

case使用、これは正規表現に似た非常に単純なパターンマッチングシステムです。たとえば、いくつかのツールはfind実際には以下をサポートしています。両方(この場合-nameとを通じて-regex)。しかし、状況はより複雑です。さまざまな状況があります。正規表現。一部のツールは1つだけをサポートし、一部のツールは複数をサポートします。各ツールとバージョンの組み合わせに関するページやその他の参照文書の内容を確認するだけですman(それでも把握するのは難しいです)。参照リストは膨大で、これは非常に便利な答えだとは思わない。

答え2

正規表現を使用する際の主な違いは、文字列全体を一致させる必要があるかどうかです。caseとは異なるbashコマンドではfind文字列全体を一致させる必要があり、などではsed文字列awkgrep一部を一致させる必要があります。それ以外は似ていますが、確かに同じではありません。

たとえば、casebash シェルのステートメントで正規表現を使用する場合、正規表現が文字列全体を記述すると仮定します。つまり(私はここの例)

case $SERVER in
db-[0-9]+\.host\.com) echo "DB server"
;;
*)echo "Unknown server"
;;
esac

db-[0-9]+.host.comは、「db-」で始まり、1つ以上の数字を経て最後に「.host.com」で終わる文字列を記述するので、db-1 .hostです。 .comは一致しますが、xdb-1.host.comは一致しません。

今を見て、sed同様の方法で検索パターンを作成すると、

echo "xdb-1.host.com"| sed -nr '/db-[0-9]+\.host\.com/p'

sedコマンドとは異なり、casexdb-1.host.com行はその文字列内の検索パターンを見つけることができるので印刷されます。したがって、文字列全体を一致させるのではなく、パターンの発生を見つけるのはアイデアです。

同様にfind、コマンドで正規表現を使用する場合は、文字列全体が一致する必要があります。例えば、

find / -regextype sed -regex ".*\.dat"

拡張子がdatであるすべてのファイルが検索されます。しかし、次のようにsed同じ検索を試すと

find / | sed -nr '/.*\.dat/'

ファイル名に ".dat"文字列を含むすべてのファイルと一致します。

もちろん微妙な構文の違いがあります。たとえば、次のようにすると

find / -name "*.dat"

これも正規表現です。ここで、*は「任意の記号」を意味しますが、厳密に言えば正規表現では「.*」を書く必要があります。ここで、「.」は任意の記号を意味し、*は任意の数の「.」タイプを意味します。したがって、任意の数のランダムなシンボルを一緒に表します。

関連情報