私はUnixに初めて触れ、偶然に好奇心を見つけました。一部のシェル構成(case
またはfind
)はパターンマッチングを使用しますが、正確に正規表現ではありません。ed
、 などの他のコマンドは、 sed
パターンマッチングに正規表現を使用します。正規表現を使用するシェルコマンド(組み込み、プログラム)とは異なる種類のパターンマッチングを使用するコマンドを一覧表示できますか?vi
awk
答え1
答え2
正規表現を使用する際の主な違いは、文字列全体を一致させる必要があるかどうかです。case
とは異なるbashコマンドではfind
文字列全体を一致させる必要があり、などではsed
文字列awk
のgrep
一部を一致させる必要があります。それ以外は似ていますが、確かに同じではありません。
たとえば、case
bash シェルのステートメントで正規表現を使用する場合、正規表現が文字列全体を記述すると仮定します。つまり(私はここの例)
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
コマンドとは異なり、case
xdb-1.host.com行はその文字列内の検索パターンを見つけることができるので印刷されます。したがって、文字列全体を一致させるのではなく、パターンの発生を見つけるのはアイデアです。
同様にfind
、コマンドで正規表現を使用する場合は、文字列全体が一致する必要があります。例えば、
find / -regextype sed -regex ".*\.dat"
拡張子がdatであるすべてのファイルが検索されます。しかし、次のようにsed
同じ検索を試すと
find / | sed -nr '/.*\.dat/'
ファイル名に ".dat"文字列を含むすべてのファイルと一致します。
もちろん微妙な構文の違いがあります。たとえば、次のようにすると
find / -name "*.dat"
これも正規表現です。ここで、*は「任意の記号」を意味しますが、厳密に言えば正規表現では「.*」を書く必要があります。ここで、「.」は任意の記号を意味し、*は任意の数の「.」タイプを意味します。したがって、任意の数のランダムなシンボルを一緒に表します。