2013-12-17 11 views
6

Ho una domanda su sed. Da questo ingresso:Sed per cercare 2 pattern, se il primo pattern non esiste, stampare il secondo pattern

[/=TueGreen$58.30Orange5:36pmSat*=WedOrange$76.63Purple6:20pmTue] 
[/=Thu6:06pm$09.05Blue11:32amMon/=Thu1:38am$56.41Red4:25amThu] 
[/=Sun1:49pm$12.41Yellow2:51pmMon*=FriOrange$49.68Blue1:24pmTue] 
[/=Sat11:58am$82.24Orange3:44amMon*=Thu1:08am$33.49Red8:21amSat] 

devo fare un uscita:

$58.30 
6:06pm$09.05 
1:49pm$12.41 
11:58am$82.24 

Lo so, lo schema sembra così facile, ma, sto anche fallito nel trovare il modello di tempo. Perché l'ora è a volte 1 o 2 cifre.

Questo è il terzo giorno che sto imparando sed e cercando la risposta. Ho imparato Grep. Così facile se si usa grep. Ma questo incarico mi obbliga a usare sed. Finora, questo è il mio comando sed:

sed 's/.*\([0-9]*:[0-9]*\(am\|pm\)\).*/\1/' FILE 

I risultati mostrano solo i minuti e am/pm. Ci sono molti schemi temporali in ciascuna riga dell'input. Ma il mio risultato mostra il modello dell'ultima volta in ogni riga. Come potete vedere qui sotto:

:20pm 
:25am 
:24pm 
:21am 

Dove ho sbagliato?

+0

+1 per molto buona prima domanda, compresi i dati di esempio, risultati attesi, corrente di uscita, e .... rantolo, un tentativo da parte O.P. di aver risolto il proprio problema. Hmm, il tuo titolo non sembra corrispondere alla tua descrizione, ma che diamine, è la stagione delle vacanze. Buona fortuna e continua a postare! – shellter

risposta

5

Qui si va:

sed -e 's/[^$0-9]*\([0-9:]*[ap]m\)*\(\$[0-9.]*\).*/\1\2/' 
+0

Wow, grazie molte. Questo funziona. Imparerò su questo comando. Grazie mille ancora una volta. Hai migliorato la mia giornata. :) – mprabuw

+0

Haha, prego. Ho perso i voti per oggi a causa della caccia al cappello, ma svaluterò la tua eccellente domanda domani ;-) – janos

+0

partendo dal presupposto che ci sia sempre un valore per il "giorno" della linea (il caso nel campione) e mai un cifra nell'elemento associato al giorno (il colore è come nel caso del campione). Molto efficiente sed – NeronLeVelu