2010-07-23 13 views
24

Sono in guscio e ho questa stringa: 12 BBQ ,45 rofl, 89 lolCome estrarre un valore da una stringa usando regex e una shell?

Utilizzando la regexp: \d+ (?=rofl), voglio 45 di conseguenza.

È corretto utilizzare regex per estrarre i dati da una stringa? Il meglio che ho fatto è quello di evidenziare il valore in alcuni editor di espressioni regolari online. La maggior parte delle volte rimuove il valore dalla mia stringa.

Sto esaminando expr, ma tutto quello che ottengo è errori di sintassi.

Come posso estrarre 45 in uno script di shell?

+1

Che strumento si usa, quale shell si usa, qual è la linea di comando esatto che hai usato e che cosa è l'errore che hai? – Abel

+0

IMHO per questo scopo, utilizzando Regex è completamente accettabile. –

risposta

41

È possibile farlo con modalità perl di GNU grep:

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

-P significa Perl-stile, e -o unico mezzo partita.

+0

E 'possibile evitare l'uso di stile perl, perché è rimosso da grep in OS X da Mountain Lion? – AlexKorovyansky

+0

Possibile alternativa/soluzione alternativa per OS X sta utilizzando gnu grep tramite homebrew, http://www.heystephenwood.com/2013/09/install-gnu-grep-on-mac-osx.html. – AlexKorovyansky

+0

È possibile recuperare il numero di porta dei contenitori finestra mobile: D con 'porta docker c62c1c7b9efb | grep -P '(\ d +) $' -o' –

8

Sembra che tu stia chiedendo più cose. Per rispondere a loro:

  • Sì, è ok per estrarre i dati da una stringa utilizzando le espressioni regolari, che è quello che stanno lì per
  • Si ottiene errori, che uno e quale shell strumento si usa?
  • È possibile estrarre i numeri dalla loro cattura tra parentesi cattura:

    .*(\d+) rofl.* 
    

    e utilizzando $1 per ottenere la stringa out (.* è per "il resto, prima e dopo sulla stessa linea)

con sed come ad esempio, l'idea diventa tale per sostituire tutte le stringhe in un file con solo il numero corrispondente:

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

o:

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

Nel tuo esempio non hai bisogno di nessuno dei due '. *' Hai solo bisogno di quelli sui bordi se la tua regex è ancorata. Indefinito, sarà già abbinato ovunque all'interno della stringa. – Daenyth

+0

L'OP ha chiesto di ottenere solo il numero, non di fare una corrispondenza riuscita. Aggiungendo '. *', È un modo semplice per abbinare tutto e sostituirlo con ciò che è racchiuso tra parentesi. Senza di loro, il resto della stringa rimane intatto, che non è quello che è stato chiesto (iiuc). O forse mi sono perso qualcosa? – Abel

+0

Woops, ho perso il fatto che stavi usando 'sed' per questo. Proseguire. – Daenyth

-1

si può certamente estrarre quella parte di una stringa e questo è un ottimo modo per analizzare fuori i dati. La sintassi delle espressioni regolari varia molto, pertanto è necessario fare riferimento al file della guida per la regex che si sta utilizzando. Si potrebbe provare un'espressione regolare come:

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

Se il programma regex può fare la sostituzione di stringa quindi sostituire l'intera stringa con il risultato che si desidera e si può facilmente utilizzare tale risultato.

Non hai menzionato se stai usando bash o qualche altra shell. Ciò aiuterebbe a ottenere risposte migliori quando chiedeva aiuto.

6

Sì, l'espressione regolare può essere utilizzata per estrarre parte di una stringa. Sfortunatamente diversi tipi di * nix e strumenti diversi usano varianti del Regex leggermente diverse.

Questo comando sed dovrebbe funzionare sulla maggior parte dei sapori (Testato su OS/X e Redhat)

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

è possibile utilizzare la shell (bash per esempio)

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

È possibile utilizzare rextract per estrarre usando un'espressione regolare e riformattare il risultato.

Esempio:

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

È necessario aggiungere una dichiarazione di non responsabilità se una libreria è la tua (qualcosa come "Disclaimer: ho fatto questa libreria"). E da github, sembra che questa libreria/eseguibile sia la tua – Justin

Problemi correlati