1

私は違いが何であるか知りたい:

sudo egrep "(08/21/13\-)*(61284103)" /path/to/some_file
sudo egrep "(08/21/13)\-*(61284103)" /path/to/some_file

詳細については、ファイル「some_file」に次の情報があるとしましょう。

08/21/13-01:15:09 foo bar bar and other foo = 11 (61284103)
08/21/13-01:15:11 foo bar number 61284103 another foo

最初のものは両方の行を返しますが、2番目のものは機能しません。

4

3 に答える 3

3
sudo egrep "(08/21/13\-)*(61284103)" /path/to/some_file
sudo egrep "(08/21/13)\-*(61284103)" /path/to/some_file

最初の正規表現は、日付とハイフンの 0 個以上の一致を検索しますが、2 番目の正規表現は、日付の後に 0 個以上のハイフンとその数字が続くことを期待します。どちらの正規表現もあなたが使いたいものではないと思います。

おそらく.*正規表現の途中で使用することをお勧めします。これにより、日付と数値の間の任意のテキストが許可されます。括弧や\エスケープする必要はありません-

sudo egrep "08/21/13-.*61284103" /path/to/some_file
于 2013-08-28T18:20:55.780 に答える
3

あなたの最初の表現は「偶然うまくいく」です。実際、一致しているのはその部分だけです。最初の部分は、2 番目の部分の直前にある61284103「0 個以上のインスタンス」を探しており、そこにあります (0 回)。08/21/13-2 番目の部分では、最初の式を探し、その後に の 0 個以上のインスタンスが-続き、その後に 2 番目の式が続きます。それはうまくいきません - 間に「他のもの」があります。

最初の式と 2 番目の式の両方に一致する行が実際に必要な場合は、次を使用する必要があります。

08/21/13.*61284103

これは、「正確に文字列の08/21/13後に「任意の文字の 0 個以上のインスタンス」( .*) が続き、その後に「正確に文字列61284103. それはあなたが求めていたものです。

于 2013-08-28T18:21:17.523 に答える
2

最初のものでは、すべて08/21/13-0 回以上繰り返します。したがって、次のようなものを探しています。

61284103
08/21/13-61284103
08/21/13-08/21/13-61284103
...

it0回を照合することで、両方の行に一致させることができます (最初のバリアント)。

2 番目のものは一致08/21/13し、0 個以上のハイフンを繰り返します。したがって、次のようなものを探しています。

08/21/1361284103
08/21/13-61284103
08/21/13--61284103
...

ただし、どの文字列も08/21/13ハイフンだけで区切られ61284103ていないため、どちらの行にも一致しません。

*ワイルドカードとして使用したい場合は、.*代わりに使用します (任意の文字を 0 回以上繰り返します)。

于 2013-08-28T18:17:44.590 に答える