私は正規表現に初めて触れ、各ゲームのユニークなイベントをすべて抽出しようとしています。したがって、ファイルにFAカップの試合がどれだけあるかに関係なく、FAカップを返す必要がありますが、一度だけ返されます。
<Date="2014-02-15" Competition="FA Cup" Home="West Bromwich Albion">
実績のあるソリューションに基づいてこの質問はここにあります。、私はこれを試しました:
grep -o 'Competition=".*\" 'Soccer_Data.xml' | sort --unique
ただし、それ以降のすべての項目が返されますCompetition="
が、二重引用符が最初に発生する前のすべての項目のみが返されます"FA Cup"
。つまり。また同じ試合で何度も戻ってきます!
.*?
複数の返品を防ぐために、以下の解決策で提案されているように試しましたが、何も返さず、正反対の問題が発生しました!
https://stackoverflow.com/questions/22444/my-regex-is-matching-too-much-how-do-i-make-it-stop
誰が使用する正しい正規表現が何であるかを教えてもらえますか?
答え1
grep
使用Posix 基本正規表現基本的に。
.*
基本正規表現では常に貪欲なマッチングは、これまでのすべての項目と一致することを意味します。最後 "
並んで。
[^"]*
を除くすべてと一致させるために反対を使用できます"
。
grep -o 'Competition="[^"]*"' 'Soccer_Data.xml' | sort --unique
出力:
Competition="FA Cup"
または、.*?
貪欲でない修飾子を提供するPerl互換正規表現を使用してください()。あなたのバージョンでそれを提供している場合は、
それを使用できます(質問にタグを追加したためにそうなります)。grep -P
grep
[ubuntu]
grep -Po 'Competition=".*?"' 'Soccer_Data.xml' | sort --unique
または、たとえば、FA CUP
次のように受信します。「避ける」--> \K
:
grep -Po 'Competition="\K[^"]*' 'Soccer_Data.xml' | sort --unique
出力:
FA Cup