sed: individuare occorrenze multiple

Se avete problemi con l'installazione e la configurazione di Slackware postate qui. Non usate questo forum per argomenti generali... per quelli usate Gnu/Linux in genere.

Moderatore: Staff

Regole del forum
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.
Avatar utente
targzeta
Iper Master
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

Messaggio da targzeta »

Eccoti un'altra soluzione (nota che ho modificato anche quella del post precedente):

Codice: Seleziona tutto

sed -n 'H;${x;s/\n \+//g;p}' nomefile
se vuoi eliminare il newline iniziale:

Codice: Seleziona tutto

sed -n 'H;${x;s/\n \+//g;s/^\n//;p}' nomefile
Questi comandi con quello del post precedente non sono del tutto simili. Ci sono due differenze:
  • se la prima riga inizia con uno spazio questi comandi eliminano quello spazio, il comando precedente no (lascia sempre inalterata la prima riga).
  • questi ultimi due comandi sono poco performanti perchè in pratica salvano tutto il file in memoria e poi effettuano le sostituzioni solo alla fine del file.
Emanuele
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
ZeroUno
Staff
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

Messaggio da ZeroUno »

spina ha scritto:Non so se ti piace, ma questo (casino) dovrebbe fare la stessa cosa:
Ora non ho il tempo di analizzarle, ma il concetto era il sapere se si poteva evitare una stringona che più che stringona, poi, era un programma in vera regola
Non capisco comunque perchè non ti piace la tua soluzione.
Mi piace, ma volevo sapere se c'era qualcosa di più compatto. Faccio un esempio:
tempo fa avevo bisogno di eliminare, in un file, tutti le righe doppioni, ma lasciando inalterato l'ordine del file. quindi un elenco
a
d
a
c
d
a
b
diventerebbe
a
d
c
b

io l'avevo fatto in modo astruso, qualcosa tipo:
aggiungi numero riga all'inizio|ordina per seconda colonna|elimina i duplicati|ordina per prima colonna|elimina prima colonna
funziona ma non è elegante. Chiedendo al forum risultò che tutto questo coso si poteva sostituire con un comando di 10/15 caratteri scritti in awk.

Le ultime che soluzioni che mi hai dato mi piacciono, ma ora non ho tempo.
Packages finder: slakfinder.org | Slackpkg+, per aggiungere repository a slackpkg

Codice: Seleziona tutto

1011010 1100101 1110010 1101111 - 0100000 - 1010101 1101110 1101111

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: sed: individuare occorrenze multiple

Messaggio da anycolouryoulike »

spina ha scritto:Non so se ti piace, ma questo (casino) dovrebbe fare la stessa cosa:

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' nomefile
Non capisco comunque perchè non ti piace la tua soluzione.

Emanuele
:shock:
Questa, anche se non mi serve assolutamente a nulla, me la voglio proprio studiare quando ho un po' di tempo.
Anche se, dovendola usare, preferirei assolutamente le altre due che hai proposto.

Rispondi