2009-11-15 4 views
9

Da der EingangWarum scheitert dieses `grep -o` und wie soll ich es umgehen?

echo abc123def | grep -o '[0-9]*' 

auf einem Computer (mit GNU grep 2.5.4), gibt diese 123, und auf einem anderen (mit GNU grep 2.5.1) gibt sie den leeren String. Gibt es eine Erklärung dafür, warum Grep 2.5.1 hier fehlschlägt, oder ist es nur ein Fehler? Ich benutze grep -o auf diese Weise in einem Bash-Skript, das ich gerne auf verschiedenen Computern ausführen könnte (die verschiedene Versionen von Grep haben können). Gibt es einen "richtigen Weg" für konsistentes Verhalten?

+1

Warum sollten Sie eine Regex verwenden, die überhaupt keine Zeichen enthält? Ich würde erwarten, dass es zu jeder Zeile passt, nicht nur zu Zeilen mit Ziffern. –

Antwort

9

Ja, der 2.5.1 -o Handhabung war Buggy: http://www.mail-archive.com/[email protected]/msg00993.html

Grep ist wahrscheinlich nicht das richtige Werkzeug für diese; sed oder tr oder sogar perl könnte besser sein, je nachdem, was die eigentliche Aufgabe ist.

+0

+1: Aber wenn es Unterschiede zwischen kleineren GNU 'grep' Versionen gibt (auch wenn es auf Fehler zurückzuführen ist), gibt es keine große Chance, Konsistenz zwischen verschiedenen Computern zu finden. Es gibt jedoch viele andere Werkzeuge. – pavium

+1

Die Empfehlung, ein anderes Tool zu verwenden, ohne eine korrekte Lösung, ist keine gute Antwort. Als Beweis kann es in den meisten Fällen mit reinem Bash gelöst werden. Sie haben keine genaue Lösung für mich angegeben. – kisp

0

Dies wird ähnliche Ergebnisse:

echo abc123def | sed -n 's/[^0-9]*\([0-9]\+\).*/\1/p' 

ist Ihre Frage ein Quasi-Duplikat von this one.

2

können Sie die Shell verwenden.

sein schnell
$ str=abc123def 
$ echo ${str//[a-z]/} 
123 
2

Ich hatte das gleiche Problem und fand, dass egrep auf dieser Maschine installiert wurde. Eine schnelle Lösung wurde mit

echo abc123def | egrep -o '[0-9]*' 
-1

Weil Sie einen regulären Ausdruck verwenden, so müssen Sie entweder:

  1. grep -E
  2. egrep (wie Sebastian veröffentlicht).

Viel Glück!

+2

-E/egrep wird für * erweiterte * reguläre Ausdrücke benötigt; '[0-9] *' ist ein gültiger einfacher regulärer Ausdruck. (Das 're' in 'grep' steht für regulären Ausdruck). Vielleicht war der Fehler in 2.5.1 nicht in der erweiterten Unterstützung für reguläre Ausdrücke vorhanden, aber die bloße Tatsache, dass ein regulärer Ausdruck verwendet wird, bedeutet nicht, dass Sie -E brauchen. – chepner

Verwandte Themen