2016-05-05 7 views
0

Strings:Wie grep Strings so?

4b30a444-86c9-4fb8-b5dc-ba721e30fb24  
a8e4e6a8-5655-4adc-a393-ccbb6848c9dc 
cc1918be-a532-4ebe-948a-de78cc455fcb 
12b6e407-4ec0-4cc6-80d4-b38d7df99694 
5b153e1f-6abd-4fd9-9ce2-c7917010f3ee 

habe ich versucht, diese:

egrep [a-z0-9]-[a-z0-9]-[a-z0-9]-[a-z0-9]-[a-z0-9] 

egrep '[a-z]{2,}-[a-z]{2,}-[a-z]{2,}-[a-z]{2,}-[a-z]{2,}' 

egrep '.-.-.-.-.' 

Aber nichts geschah

+0

Es ist immer einfach, eine Regexp zu schreiben, die den Strings entspricht Sie wollen aber ** viel ** schwerer finden, einen zu schreiben, der nicht zusätzlich mit anderen Strings übereinstimmt, die Sie nicht wollen (z.B. '. *' stimmt mit allem in Ihrer Frage überein, passt aber auch zu allem anderen. Bearbeiten Sie also Ihre Frage so, dass sie nicht nur die übereinstimmenden Zeichenfolgen enthält, sondern auch den Kontext, in dem sie enthalten sind eher als eine, die den Output produzieren wird, den Sie heute erwarten, und dann morgen versagen. –

Antwort

2

Verwendung + für 1 oder mehr Zeichen dieser Zeichenklasse wie folgt aus:

$ egrep '[a-z0-9]+-[a-z0-9]+-[a-z0-9]+-[a-z0-9]+-[a-z0-9]+' data 
4b30a444-86c9-4fb8-b5dc-ba721e30fb24  
a8e4e6a8-5655-4adc-a393-ccbb6848c9dc 
cc1918be-a532-4ebe-948a-de78cc455fcb 
12b6e407-4ec0-4cc6-80d4-b38d7df99694 
5b153e1f-6abd-4fd9-9ce2-c7917010f3ee 
$ 

oder verwenden Sie eine feste Anzahl von Zeichen mit Quantifizierung rs wie folgt aus:

$ egrep '[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}' data 
4b30a444-86c9-4fb8-b5dc-ba721e30fb24  
a8e4e6a8-5655-4adc-a393-ccbb6848c9dc 
cc1918be-a532-4ebe-948a-de78cc455fcb 
12b6e407-4ec0-4cc6-80d4-b38d7df99694 
5b153e1f-6abd-4fd9-9ce2-c7917010f3ee 

oder Sie {2,} für 2 oder mehr Zeichen wie diese verwenden:

$ egrep '[a-z0-9]{2,}-[a-z0-9]{2,}-[a-z0-9]{2,}-[a-z0-9]{2,}-[a-z0-9]{2,}' data 
4b30a444-86c9-4fb8-b5dc-ba721e30fb24  
a8e4e6a8-5655-4adc-a393-ccbb6848c9dc 
cc1918be-a532-4ebe-948a-de78cc455fcb 
12b6e407-4ec0-4cc6-80d4-b38d7df99694 
5b153e1f-6abd-4fd9-9ce2-c7917010f3ee 
1

Ich empfehle Perl-Stil reguläre Ausdruck, weil es zu den Ausdrücken viel näher ist, die wir verwendet zu verwenden, in Programmiersprachen:

c='[a-z0-9]' 
grep -P "$c{8}(?:-$c{4}){3}-$c{12}" input.txt 

Hier sparen wir Sequenz in $c Shell-Variable wiederholt.

  • -Pgrep weist Perl Stil N mal
  • {N} wiederholt vorherigen Ausdruck zu verwenden
  • (?:) schafft nicht-einfangende Gruppe für Effizienz (wir könnten nur () stattdessen verwenden)
  • (?:...){3} wiederholt Inhalt der Gruppe 3 mal
+0

Während diese Antwort eine Lösung bietet, gibt es keine Erklärung. Ruslan, können Sie einige Details hinzufügen, um zu erklären, warum das funktioniert und warum Sie denken, dass diese Lösung am besten im Vergleich zu anderen Optionen ist? – ghoti

+0

Beschreibung hinzugefügt. –

+0

Danke. Ach, mit dem Zusatz von Perl-Style kann ich wieder nicht upvoten, da es deine Antwort nicht tragbar macht. (BSD und OSX haben kein '-P'.) – ghoti