sed: individuare occorrenze multiple
Moderatore: Staff
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Slackware, se l'argomento è generale usate il forum Gnu/Linux in genere.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
- ZeroUno
- Staff

- Messaggi: 5441
- Iscritto il: ven 2 giu 2006, 14:52
- Nome Cognome: Matteo Rossini
- Slackware: current
- Kernel: slack-current
- Desktop: ktown-latest
- Distribuzione: 01000000-current
- Località: Roma / Castelli
- Contatta:
sed: individuare occorrenze multiple
Ho bisogno di una sed che mi elimini tutto questo testo separatore e mi lasci i blocchetti separati da uno spazio o qualcos'altro.
Esempio:
ciao123a-tutti456-help@me789grazie_01
i blocchetti saranno intercettati dall'espressione [0-9]{3}, quindi l'output dovrà essere
123 456 789
ovviamente il testo e i blocchetti sono più complessi, ma l'importante è che per quanto possano essere complessi l'espressione regolare è costruibile. Il numero di occorrenze non è noto a priori.
Ho fatto un po' di prove ma proprio non sono riuscito a venirne a capo.
01
Codice: Seleziona tutto
1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111- umaga
- Packager

- Messaggi: 180
- Iscritto il: lun 30 gen 2006, 10:19
- Slackware: 13.37
- Kernel: 2.6.38.4-smp
- Desktop: KDE 4.7
- Località: Cagliari
Re: sed: individuare occorrenze multiple
a=ciao123a-tutti456-help@me789grazie_01
echo $a | grep -oe '[0-9][0-9][0-9]'
l'output è stato:
123
456
789
- ZeroUno
- Staff

- Messaggi: 5441
- Iscritto il: ven 2 giu 2006, 14:52
- Nome Cognome: Matteo Rossini
- Slackware: current
- Kernel: slack-current
- Desktop: ktown-latest
- Distribuzione: 01000000-current
- Località: Roma / Castelli
- Contatta:
Re: sed: individuare occorrenze multiple
Io avevo risolto in un modo un po' più astruso:
1) con sed aggiungi un "|" prima e dopo la regexpa
2) con awk prendi solo i campi $2,$4,$6...
echo ciao123a-tutti456-help@me789grazie_01|sed -r -e 's#/([0-9]{3})#|\1|#ig'|awk -F"|" '{a=2;while($(a)){print $(a);a=a+2}}'
Codice: Seleziona tutto
1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111- targzeta
- Iper Master

- Messaggi: 6643
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: sed: individuare occorrenze multiple
Codice: Seleziona tutto
echo ciao123a-tutti456-help@me789grazie_01|grep -o '[0-9]\{3\}'|tr -s '\n' ' '- ZeroUno
- Staff

- Messaggi: 5441
- Iscritto il: ven 2 giu 2006, 14:52
- Nome Cognome: Matteo Rossini
- Slackware: current
- Kernel: slack-current
- Desktop: ktown-latest
- Distribuzione: 01000000-current
- Località: Roma / Castelli
- Contatta:
Re: sed: individuare occorrenze multiple
Codice: Seleziona tutto
echo $(echo ciao123a-tutti456-help@me789grazie_01|grep -o '[0-9]\{3\}')Codice: Seleziona tutto
for x in $(echo ciao123a-tutti456-help@me789grazie_01|grep -o '[0-9]\{3\}');do ...A questo putto approfitto per un quesito sul newline. Avendo una lista del tipo
a
b
c
a
d
a
e
f
g
a
h
i
vorrei in output
a b
c
a d
a e
f
g
a h
i
cioè se trovo la stringa 'a' allora unisci con la riga successiva del file (ovviamente 'a' può essere una regex ma è secondario). io risolvevo con una soluzione non proprio performate ma funzionate; qualcosa tipo:
Codice: Seleziona tutto
cat file.txt|while read x;do echo $x|grep -q 'a' &&echo -n "$x "||echo $x;donec'è una soluzione più rapida?
Ciao
01
Codice: Seleziona tutto
1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111- targzeta
- Iper Master

- Messaggi: 6643
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: sed: individuare occorrenze multiple
Codice: Seleziona tutto
sed -n '/^a/{N;s/\n/ /;};p;' file.txtP.S. Per leggere tutte le righe di un file si può anche usare:
Codice: Seleziona tutto
for row in $(<file.txt)- ZeroUno
- Staff

- Messaggi: 5441
- Iscritto il: ven 2 giu 2006, 14:52
- Nome Cognome: Matteo Rossini
- Slackware: current
- Kernel: slack-current
- Desktop: ktown-latest
- Distribuzione: 01000000-current
- Località: Roma / Castelli
- Contatta:
Re: sed: individuare occorrenze multiple
Grazie,spina ha scritto:Puoi usare questo:Codice: Seleziona tutto
sed -n '/^a/{N;s/\n/ /;};p;' file.txt
non si comporta correttamente in caso file.txt contiene spazi.P.S. Per leggere tutte le righe di un file si può anche usare:Codice: Seleziona tutto
for row in $(<file.txt)
Codice: Seleziona tutto
1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111- targzeta
- Iper Master

- Messaggi: 6643
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: sed: individuare occorrenze multiple
Esatto. Per essere più precisi non si comporta bene quando le righe contengono i caratteri dell'IFS che possono essere diversi dal classico:ZeroUno ha scritto:non si comporta correttamente in caso file.txt contiene spazi.spina ha scritto:P.S. Per leggere tutte le righe di un file si può anche usare:Codice: Seleziona tutto
for row in $(<file.txt)
Codice: Seleziona tutto
$> set| grep IFS
IFS=$' \t\n'Codice: Seleziona tutto
(IFS=$'\n'; for row in $(<file.txt); do ...done)Emanuele
- ZeroUno
- Staff

- Messaggi: 5441
- Iscritto il: ven 2 giu 2006, 14:52
- Nome Cognome: Matteo Rossini
- Slackware: current
- Kernel: slack-current
- Desktop: ktown-latest
- Distribuzione: 01000000-current
- Località: Roma / Castelli
- Contatta:
Re: sed: individuare occorrenze multiple
L'unico problema è quando ci deve essere interattività con l'utente:spina ha scritto:Quindi basterebbe anche fare un:ma alla fine forse è meglio usare il comando read come fai tu.Codice: Seleziona tutto
(IFS=$'\n'; for row in $(<file.txt); do ...done)
lista.txt
Codice: Seleziona tutto
dimmi il tuo nome
dimmi il tuo cognome
dimmi la tua etàCodice: Seleziona tutto
cat lista |while read a;do
echo $a
read b
echo $b
doneCodice: Seleziona tutto
1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111- targzeta
- Iper Master

- Messaggi: 6643
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: sed: individuare occorrenze multiple
Codice: Seleziona tutto
$> cat -e lista.txt
dimmi il tuo nome$
dimmi il tuo cognome$
dimmi la tua età
$> cat lista.txt| while read a;do echo $a; done
dimmi il tuo nome
dimmi il tuo cognome
Codice: Seleziona tutto
$> cat lista.txt|while read a;do echo $a; read -u 2 b; echo $b; doneEmanuele
- ZeroUno
- Staff

- Messaggi: 5441
- Iscritto il: ven 2 giu 2006, 14:52
- Nome Cognome: Matteo Rossini
- Slackware: current
- Kernel: slack-current
- Desktop: ktown-latest
- Distribuzione: 01000000-current
- Località: Roma / Castelli
- Contatta:
Re: sed: individuare occorrenze multiple
Ho scritto quel codice al volo direttamente sul forum, senza passarlo per la shellspina ha scritto: Tra l'altro il tuo comando soffre anche quando un file non ha un '\n' nell'ultima riga
Ma il caso del mancato eol alla fine del file non l'ho proprio tenuto in considerazione perchè il 99,999% dei miei file ce l'hanno tutti visto che uso vi/vim
il restante 0,001% deriva da quei file volutamente creati con echo -n
Ciao
01
Codice: Seleziona tutto
1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111-
Mario Vanoni
- Iper Master

- Messaggi: 3174
- Iscritto il: lun 3 set 2007, 21:20
- Nome Cognome: Mario Vanoni
- Slackware: 12.2
- Kernel: 3.0.4 statico
- Desktop: fluxbox/seamonkey
- Località: Cuasso al Monte (VA)
Re: sed: individuare occorrenze multiple
Codice: Seleziona tutto
[$> cat -e lista.txt
dimmi il tuo nome$
dimmi il tuo cognome$
dimmi la tua età
$
risolve il problema
/./ significa almeno un carattere.
- ZeroUno
- Staff

- Messaggi: 5441
- Iscritto il: ven 2 giu 2006, 14:52
- Nome Cognome: Matteo Rossini
- Slackware: current
- Kernel: slack-current
- Desktop: ktown-latest
- Distribuzione: 01000000-current
- Località: Roma / Castelli
- Contatta:
Re: sed: individuare occorrenze multiple
Codice: Seleziona tutto
awk -F'\n' '{if($1 ~ /^ /){s=s gensub(/^ +/,"",1)}else{print s;s=$1}}END{print s}' nomefilePer capire cosa fa:
Codice: Seleziona tutto
$ cat nomefile
riga1
riga2
riga3a
riga3b
riga4
riga5a
riga5b
riga6c
riga7Codice: Seleziona tutto
riga1
riga2
riga3ariga3b
riga4
riga5ariga5briga6c
riga7Codice: Seleziona tutto
1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111-
Mario Vanoni
- Iper Master

- Messaggi: 3174
- Iscritto il: lun 3 set 2007, 21:20
- Nome Cognome: Mario Vanoni
- Slackware: 12.2
- Kernel: 3.0.4 statico
- Desktop: fluxbox/seamonkey
- Località: Cuasso al Monte (VA)
Re: sed: individuare occorrenze multiple
root@va2:~# awk '/./ {print $1}' nomefileZeroUno ha scritto:Posso sostituirecon qualcosa di più decente?Codice: Seleziona tutto
awk -F'\n' '{if($1 ~ /^ /){s=s gensub(/^ +/,"",1)}else{print s;s=$1}}END{print s}' nomefile
Per capire cosa fa:outputCodice: Seleziona tutto
$ cat nomefile riga1 riga2 riga3a riga3b riga4 riga5a riga5b riga6c riga7Codice: Seleziona tutto
riga1 riga2 riga3ariga3b riga4 riga5ariga5briga6c riga7
Codice: Seleziona tutto
riga1
riga2
riga3a
riga3b
riga4
riga5a
riga5b
riga6c
riga7
- targzeta
- Iper Master

- Messaggi: 6643
- Iscritto il: gio 3 nov 2005, 14:05
- Nome Cognome: Emanuele Tomasi
- Slackware: 64-current
- Kernel: latest stable
- Desktop: IceWM
- Località: Carpignano Sal. (LE) <-> Pisa
Re: sed: individuare occorrenze multiple
Codice: Seleziona tutto
sed -n 'h;:next n;/^ /{H;x;s/\n *//;$b end;x;b next;};x;p;x;:end ${p;q};h;b next' nomefileEmanuele