2010-07-23 15 views
24

Ich bin in der Schale, und ich habe diese Zeichenfolge: 12 BBQ ,45 rofl, 89 lolWie extrahiere ich einen Wert aus einer Zeichenkette mit Regex und einer Shell?

den regulären Ausdruck verwenden: \d+ (?=rofl), ich will 45 als Ergebnis.

Ist es richtig, Regex zu verwenden, um Daten aus einer Zeichenfolge zu extrahieren? Das Beste, was ich getan habe, ist, den Wert in einigen der Online-Regex-Editor hervorzuheben. Meistens wird der Wert aus meiner Zeichenfolge entfernt.

Ich untersuche expr, aber alles, was ich bekomme, ist Syntaxfehler.

Wie kann ich 45 in einem Shell-Skript extrahieren?

+1

Welche Tool verwenden Sie, welche Shell verwenden Sie, was ist die genaue Kommandozeile Sie verwendet und was der Fehler ist Sie? – Abel

+0

IMHO für diesen Zweck, mit Regex ist völlig akzeptabel. –

Antwort

41

Sie können dies tun mit GNU Perl-Modus des grep:

echo "12 BBQ ,45 rofl, 89 lol"|grep -P '\d+ (?=rofl)' -o 

-P bedeutet Perl-Stil, und -o bedeutet nur Spiel.

+0

Ist es möglich, die Verwendung von Perl-Stil zu vermeiden, weil es seit Mountain Lion aus Grep in OS X entfernt wurde? – AlexKorovyansky

+0

Mögliche Alternative/Workaround für OS X ist die Verwendung von Gnu Grep über Homebrew, http://www.heystephenwood.com/2013/09/install-gnu-grep-on-mac-osx.html. – AlexKorovyansky

+0

Ich kann die Port-Nummer von Docker-Containern abrufen: D mit 'Docker-Port c62c1c7b9efb | grep -P '(\ d +) $' -o' –

8

Es scheint, dass Sie mehrere Dinge fragen. Um sie zu beantworten:

  • Ja, ist es ok ist, Daten aus einem String mit regulären Ausdrücken zu extrahieren, das ist, was sie dort für
  • Sie Fehlermeldungen erhalten, die man und welche Shell-Tool verwenden Sie?
  • Sie können die Nummern extrahieren, indem sie bei der Erfassung von Klammern fangen:

    .*(\d+) rofl.* 
    

    und $1 mit dem String raus (.* ist für „den Rest vor und nach auf der gleichen Linie)

mit als Beispiel sed, wird die Idee, dies nur mit der passenden Nummer alle Zeichenfolgen in einer Datei zu ersetzen:

sed -e 's/.*(\d+) rofl.*/$1/g' inputFileName > outputFileName 

oder:

echo "12 BBQ ,45 rofl, 89 lol" | sed -e 's/.*(\d+) rofl.*/$1/g' 
+0

Sie brauchen keines der '. *' in Ihrem Beispiel. Sie benötigen diese nur an Kanten, wenn Ihre Regex verankert ist. Nicht verankert, es passt bereits überall in die Zeichenfolge. – Daenyth

+0

Das OP hat darum gebeten, nur die Nummer zu bekommen, um kein erfolgreiches Match zu machen. Durch Hinzufügen von '. *' Ist es eine einfache Möglichkeit, alles zu vergleichen und durch die passenden Klammern zu ersetzen. Ohne sie bleibt der Rest der Saite intakt, was nicht gefragt wurde (iiuc). Oder habe ich etwas vermisst? – Abel

+0

Woops, ich habe verpasst, dass du 'sed' dafür benutzt hast. Fortfahren. – Daenyth

-1

Sie können sicher, dass ein Teil eines Strings extrahieren, und das ist eine gute Möglichkeit, Daten zu analysieren aus. Die Regular Expression-Syntax ist sehr unterschiedlich, daher müssen Sie auf die Hilfedatei für die von Ihnen verwendete Regex verweisen. Sie könnten einen regulären Ausdruck versuchen, wie:

[0-9]+ *[a-zA-Z]+,([0-9]+) *[a-zA-Z]+,[0-9]+ *[a-zA-Z]+ 

Wenn Ihr regex Programm kann string Ersatz tun dann die gesamte Zeichenfolge mit dem Ergebnis, ersetzen Sie wollen, und Sie können leicht dieses Ergebnis verwenden.

Sie haben nicht erwähnt, wenn Sie Bash oder eine andere Shell verwenden. Das würde helfen, bessere Antworten zu bekommen, wenn man um Hilfe bittet.

6

Ja Regex kann sicherlich verwendet werden, um einen Teil einer Zeichenfolge zu extrahieren. Leider verwenden verschiedene Varianten von * nix und verschiedenen Tools leicht unterschiedliche Regex-Varianten.

Dieser sed Befehl auf den meisten Aromen funktionieren sollte (getestet unter OS/X und Redhat)

echo '12 BBQ ,45 rofl, 89 lol' | sed 's/^.*,\([0-9][0-9]*\).*$/\1/g' 
0

Sie die Shell (Bash zum Beispiel) verwenden können

$ string="12 BBQ ,45 rofl, 89 lol" 
$ echo ${string% rofl*} 
12 BBQ ,45 
$ string=${string% rofl*} 
$ echo ${string##*,} 
45 
-1

Sie können rextract zu Extrahieren Sie mit einem regulären Ausdruck und formatieren Sie das Ergebnis neu.

Beispiel:

[$] echo "12 BBQ ,45 rofl, 89 lol" | ./rextract '[,]([\d]+) rofl' '${1}' 
45 
+4

Sie müssen einen Haftungsausschluss hinzufügen, wenn eine Bibliothek Ihre eigene ist (etwas wie "Disclaimer: Ich habe diese Bibliothek gemacht"). Und von Github, es scheint, dass diese Bibliothek/Programmdatei Ihre eigenen ist – Justin

Verwandte Themen