8

日付を含むテキスト ファイルがありますdd/mm/yyyy(例: 2012 年 12 月 20 日)。

日付を解析して端末に表示するために使用しようとしていますgrepが、特定のケースに遭遇するまで成功しています:

これらは私のテストケースです:

  • grep -E "\d*"2012 年 12 月 20 日を返します
  • grep -E "\d*/"2012 年 12 月 20 日を返します
  • grep -E "\d*/\d*"2012 年 12 月 20 日を返します
  • grep -E "\d*/\d*/"何も返さない
  • grep -E "\d+"また、何も返しません

この予期しない動作が発生する理由を誰かに説明してもらえますか?

編集":(弱い引用符)を'(強い引用符に置き換えると、同じ動作になり

4

4 に答える 4

12

使用した構文 ( ) は、 Bash の拡張正規表現\dでは認識されません。

grep -PPerl regex (PCRE) を使用する代わりに使用します。例えば:

grep -P "\d+/\d+/\d+" input.txt
grep -P "\d{2}/\d{2}/\d{4}" input.txt  # more restrictive

または、拡張正規表現を使い続けるには、次[0-9]の代わりに使用し\dます。

grep -E "[0-9]+/[0-9]+/[0-9]" input.txt
grep -E "[0-9]{2}/[0-9]{2}/[0-9]{4}" input.txt  # more restrictive
于 2013-01-15T14:49:17.030 に答える
4

grep が PCRE 構文を使用できるようにする -E の代わりに -P を使用することもできます。

grep -P "\d+/\d+" file

も機能します。

于 2013-01-15T14:49:27.773 に答える
2

grepおよびegrep/grep -E認識しません\d。最初の3つのパターンが機能する理由は、アスタリスクが\dオプションになっているためです。実際には見つかりません。

[0-9]またはを使用し[[:digit:]]ます。

于 2013-01-15T14:47:22.340 に答える
2

このようなケースのトラブルシューティングを支援するために、行の一致部分のみを表示する -o フラグが役立ちます。あなたのオリジナル表現で:

grep -Eo "\d*"何も返しません - \d があなたが思っていたことをしていないという手がかりです。

grep -Eo "\d*/"/ を返します (2 回) - スラッシュが一致している間に \d が一致しないことを確認します。

他の人が指摘したように、-P フラグは「\d」を認識することで問題を解決しますが、Explosion Pills の回答を明確にするために、次のように -E を使用することもできます。

grep -Eo "[[:digit:]]*/[[:digit:]]*/"20/12/を返します

編集: @shawn-chin (ありがとう!) のコメントによると、 --color を同様に使用して、行全体を表示しながら、一致する行の部分を強調表示できます。

grep -E --color "[[:digit:]]*/[[:digit:]]*/"20/12/2012 を返します(ここでは色を指定できませんが、太字の "20/12/" 部分が色になります)

于 2013-01-15T15:07:58.093 に答える