正規表現を使ったgrepが正しく動作しない

正規表現を使ったgrepが正しく動作しない
ssh1% cat temp

sarah

saab

marrrrrrrrra

marrrrrrrtha

ssh1% grep ar*a temp

grep: No match.

これは出力ではないでしょうか?

sarah saab marrrrrra

Windows 10 で putty と nxclient を使ってみました。

答え1

を使用していますcshが、これは を認識し*、それを として展開しようとします。シェルグロブ失敗します。つまり、cshここでは「一致なし」と言っているのであって、 ではありませんgrepボーン家の貝殻は、csh展開不可能な glob パターンをコマンドに渡さないので、cshに解放するには引用符で囲む必要がありますgrep

ここではシングルクォートの使用をお勧めします。補間する変数を文字列に代入します:

% grep 'ar*a' temp
sarah
saab
marrrrrrrrra

この場合、パターンに が含まれていないため$、二重引用符も機能しますが、ここではとにかく一重引用符を使用することをお勧めします。シェル、Perl など、半互換的に使用できる言語では、どの引用符を使用するかを慎重に検討することは、習得する価値のある習慣です。ここでは文字列の補間は必要ないため、それを許可する引用符スタイルを使用しないことを選択します。

ところで、BourneファミリーシェルでもREパターンを引用符で囲む必要があります。Mike Wagnerが上記のコメントで示唆しているように、正規表現とglobパターンは同じ特殊文字を多く使用する、REパターンを次のように書くこともできます。起こる一部のファイルにも一致するため、シェルによって予期せず拡張されます。

関連情報