Ho dei file di testo tipo:
[...]
Sample Name: 909388-001 1° 1:10
[...]
oppure
[...]
Sample Name: Std livello 3 Injection
Volume: 25,0
[...]
oppure
[...]
Sample Name: 909436-002 1:2 Injection
Volume: 25,0
[...]
Io dovrei in questi file andare a prendere il sample name. Prima faccio
un grep Sample\ Name e poi pensavo di prendere il sample name con sed.
Mi piacerebbe dire qualcosa tipo:
prendi dopo Sample\ Name:[\ \t]* tutto fino a Injection oppure, se
Injection non c'è, fino alla fine della riga.
Spero di essermi spiegato.
Grazie mille
Piviul
--
Per REVOCARE l'iscrizione alla lista, inviare un email a
debian-ital...@lists.debian.org con oggetto "unsubscribe". Per
problemi inviare un email in INGLESE a listm...@lists.debian.org
To UNSUBSCRIBE, email to debian-ital...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listm...@lists.debian.org
In ogni caso non è possibile fare il match di tutto fino a che non si
incontri la parola tizio oppure la parola caio? Questo non lo so proprio
fare.
Mille grazie.
Beh, potresti prima di tutto togliere "Injection", cosi poi ti basta
gestire il caso in cui "Injection" non c'è..
Ma mi pare troppo semplice, quindi forse non ho capito bene... :)
--
DaC
44°59'N 7°27'E
A quanto pare, sed non supporta l'opzione nongreedy.
Una possibilità potrebbe essere cut, tipo:
grep ^Sample prova.txt | cut -b 15-50
Questo funziona se c'è una certa regolarità tra le colonne, ovvero se
non succede mai che Injection inizi prima di quando finisce l'ultimo
Sample Name.
Un'altra possibilità, se tra Sample Name: e il nome e poi tra il nome
e Injection ci sono almeno due spazi, è:
grep ^Samp prova.txt | sed "s/[ \t][ \t]\+/|/g" | gawk -F"|" '{print $2}'
pietro
Una stringa di caratteri "comuni" dovrebbe matchare se stessa, quindi,
ammettendo che compaia in tutte le righe..
s/^Sample Name:[ \t]*\(.*\)[ \t]*Injection/&1/
dovrebbe *forse* (non l'ho provato) trasformarti la riga lasciando
solo ciò che ti interessa.
L'uso di \( \) e &1 penso tu lo possa approfondire nel man.
HTH,
--
DaC
44°59'N 7°27'E
Ciao e mille grazie ancora
Piviul
> grep ^Samp prova.txt | sed "s/[ \t][ \t]\+/|/g" | gawk -F"|" '{print $2}'
>
Perfetto, non ci avevo pensato! al posto di gawk poi si potrebbe sempre
usare cut -d\| -f 2
Mille e mille grazie!!!
Piviul
Se ho capito bene ecco un esempio:
$ cat file1.tmp
Sample Name: 909388-001 1° 1:10
Sample Name: Std livello 3 Injection
Volume: 25,0
Sample Name: 909436-002 1:2 Injection
Volume: 25,0
$ cat script.sed
/^Sample Name:/ {
s/[ \t]*Injection.*//
s/^Sample Name:[ \t]*//
p
}
$ sed -nf script.sed file1.tmp
909388-001 1° 1:10
Std livello 3
909436-002 1:2
$
Lo script sed seleziona solo le righe che servono, ne elimina la parte
finale se necessario, poi elimina la parte iniziale e poi stampa ciò che
rimane, cioè uno o più campi. Sed è eseguito con l'opzione '-n' in modo
da non trovare sullo standard output tutte le altre righe.
Saluti,
alfredo
> Ciao a tutti, come si fa a matchare tutto fino a che non contiene
> opzionalmente una parola?
>
> Ho dei file di testo tipo:
> [...]
> Sample Name: 909388-001 1° 1:10
> [...]
>
> oppure
> [...]
> Sample Name: Std livello 3 Injection
> Volume: 25,0
> [...]
>
> oppure
> [...]
> Sample Name: 909436-002 1:2 Injection
> Volume: 25,0
> [...]
Mah, se ho capito bene cosa intendi, secondo me si può fare tutto con
una sola riga di awk. Qualcosa tipo:
gawk -F"Injection" '/Sample Name/ {split($1,a,"Sample Name:");print
a[2]}' nome_del_tuo_file
Non l'ho testato, magari fai una prova tu ;-)
Saluti
Scander
vuoi recuperare anche la riga con "Volume:"?
oppure solo quello che sta scritto dopo "Sample Name"?
Max
Ancora mille e mille grazie
Piviul