特定の部分文字列で始まり、最初の引用符で終わるすべての文字列をgrepします。

特定の部分文字列で始まり、最初の引用符で終わるすべての文字列をgrepします。

私は正規表現に初めて触れ、各ゲームのユニークなイベントをすべて抽出しようとしています。したがって、ファイルに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 -Pgrep[ubuntu]

grep -Po 'Competition=".*?"' 'Soccer_Data.xml' | sort --unique

または、たとえば、FA CUP次のように受信します。「避ける」--> \K:

grep -Po 'Competition="\K[^"]*' 'Soccer_Data.xml' | sort --unique

出力:

FA Cup

関連情報