grep が正規表現に一致する項目を見つけられませんでした。

grep が正規表現に一致する項目を見つけられませんでした。

数字はゼロで始めることはできません。

reg exを使用してこのgrepコマンドを実行しました。

❯ echo "#time 1m" | grep -E -o "#time\s(?!0)\d{1,2}[m|h|d]"

次の出力を取得します。

zsh: event not found: 0

グラフィックレジストリ拡張テスターで試した結果、一致することがわかりました。ここに画像の説明を入力してください。

答え1

zsh: event not found: 0

これは、シェルが!履歴拡張をトリガとして扱うためです。文字列を一重引用符で囲むか、zshまたはBashでset +o histexpand使用して履歴拡張を無効にします。たとえば、参照してください。setopt nohistexpandset +HBashの感嘆符(!)を理解する

... grep -E -o "#time\s(?!0)\d{1,2}[m|h|d]"

\s(?!...)およびはPerl\d正規表現の一部であり、grep -E使用される標準拡張正規表現ではありません。[m|h|d]、またはいずれかの単一文字と一致します。これを書く方が良いかもしれませんが、それを意味するかもしれません(またはそれを書くより長い方法です)。m|hd[mhd|][mhd](m|h|d)

正規表現を標準のEREに書き換えるか、grep -PGNU grepなどのPerl正規表現を使用できるツールに切り替える必要があります。

バラより私の正規表現がXでは動作しますが、Yでは動作しないのはなぜですか?

答え2

REとは何の関係もありません。これにより、シェルは文字列の内部を確認して評価できます。 (エラーメッセージはzsh.の代わりに.で始まりますgrep。)これを防ぐには、二重引用符(')の代わりに一重引用符(")を使用してください。

関連情報