eliminare paragrafo con sed

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
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
submax82
Staff
Staff
Messaggi: 3202
Iscritto il: mer 31 ago 2005, 0:00
Desktop: xfce
Distribuzione: SalixOS
Contatta:

eliminare paragrafo con sed

Messaggio da submax82 »

tutte le volte che utilizzo sed per cose che non siano banali ci litigo! :D

devo eliminare un testo che è scritto su più righe da un file che lo contiene al suo interno... nessuno ha qualche idea? serve per una futura versione di gslacky installer...

Mario Vanoni
Iper Master
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: eliminare paragrafo con sed

Messaggio da Mario Vanoni »

submax82 ha scritto:tutte le volte che utilizzo sed per cose che non siano banali ci litigo! :D

devo eliminare un testo che è scritto su più righe da un file che lo contiene al suo interno... nessuno ha qualche idea? serve per una futura versione di gslacky installer...
UNIX KISS rule

[n]vi file_da_cambiare
vai sulla prima riga da eliminare
noti il numero di questa riga, metti sia 33
vai sull'ultima riga da eliminare
noti il numero di questa riga, metti sia 66
:33,66d
:wq
et voila`

EDIT PS:
se conosci le righe, puoi usare anche
sed -e '33,66d' file_da_cambiare

oppure anche ed(1) o ex(1).

Mario Vanoni

Avatar utente
mauro
Linux 2.x
Linux 2.x
Messaggi: 281
Iscritto il: gio 11 mag 2006, 21:51
Slackware: current
Kernel: uno degli ultimi...
Desktop: dwm

Re: eliminare paragrafo con sed

Messaggio da mauro »

@mario: magari il testo da eliminare e' localizzato su righe diverse da file a file, e se sono tanti non e' il caso di editarli uno per uno.
@submax82: non ho capito... non e' che puoi postare un esempio? il testo e' sempre lo stesso o lo identifichi in base a qualcosa di specifico?

Mario Vanoni
Iper Master
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: eliminare paragrafo con sed

Messaggio da Mario Vanoni »

mauro ha scritto:@mario: magari il testo da eliminare e' localizzato su righe diverse da file a file, e se sono tanti non e' il caso di editarli uno per uno.
@submax82: non ho capito... non e' che puoi postare un esempio? il testo e' sempre lo stesso o lo identifichi in base a qualcosa di specifico?
Hai ragione mauro,
ma come identificare piu` righe consecutive?
La prima ed ovvia, no problems
sed -e '/quello_che_vuoi_inconfondibile/d'
magari ancorata con /^...$/
pero` attenti all RE interpretate,
ma le seguenti?
E come riconoscere l'ultima e smettere?

OK, GNU sed sopporta estensioni stile
sed -e '/prima_riga_inconfondibile/,+10d
cancella anche le seguenti 10 righe.
Con piu` files usabile, con numero fisso di righe.

EDIT: altra possibilita`, dai tempi di AT&T sed
Un file con tutto il testo che vuoi eliminare,
ad ogni riga aggiungi all'inizio
/^
alla fine della riga
$/d
chiamalo magari file.sed
poi
sed -f file.sed il_file_che_vuoi

ATTENTI: con frasi uguali in il_file_che_vuoi, GUAI IN VISTA !!!

Mario Vanoni

Avatar utente
submax82
Staff
Staff
Messaggi: 3202
Iscritto il: mer 31 ago 2005, 0:00
Desktop: xfce
Distribuzione: SalixOS
Contatta:

Re: eliminare paragrafo con sed

Messaggio da submax82 »

mauro ha scritto:@mario: magari il testo da eliminare e' localizzato su righe diverse da file a file, e se sono tanti non e' il caso di editarli uno per uno.
@submax82: non ho capito... non e' che puoi postare un esempio? il testo e' sempre lo stesso o lo identifichi in base a qualcosa di specifico?
mi serve nella rimozione di gslacky per rimuovere queste righe da /etc/rc.d/rc.local
## Added by Gnome-Slacky 2.20.3 ##
if [ -x /etc/rc.d/rc.gnome ]; then
. /etc/rc.d/rc.gnome
fi
mi piacerebbe un metodo con sed che indichi proprio espressamente il paragrafo da eliminare... non mi piace la soluzione a base del numero di riga...

Avatar utente
conraid
Staff
Staff
Messaggi: 13630
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

Re: eliminare paragrafo con sed

Messaggio da conraid »

submax82 ha scritto:
mauro ha scritto:@mario: magari il testo da eliminare e' localizzato su righe diverse da file a file, e se sono tanti non e' il caso di editarli uno per uno.
@submax82: non ho capito... non e' che puoi postare un esempio? il testo e' sempre lo stesso o lo identifichi in base a qualcosa di specifico?
mi serve nella rimozione di gslacky per rimuovere queste righe da /etc/rc.d/rc.local
## Added by Gnome-Slacky 2.20.3 ##
if [ -x /etc/rc.d/rc.gnome ]; then
. /etc/rc.d/rc.gnome
fi
mi piacerebbe un metodo con sed che indichi proprio espressamente il paragrafo da eliminare... non mi piace la soluzione a base del numero di riga...
Te l'ha detto Mario sopra
sed -e '/## Added by Gnome-Slacky 2.20.3 ##/,+3d' rc.local

Avatar utente
submax82
Staff
Staff
Messaggi: 3202
Iscritto il: mer 31 ago 2005, 0:00
Desktop: xfce
Distribuzione: SalixOS
Contatta:

Re: eliminare paragrafo con sed

Messaggio da submax82 »

non c'è una soluzione che mi permette di indicare proprio la stringa esatta ? senza +3 ecc... (anche quella però pensandoci non è male...)

Mario Vanoni
Iper Master
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: eliminare paragrafo con sed

Messaggio da Mario Vanoni »

submax82 ha scritto:non c'è una soluzione che mi permette di indicare proprio la stringa esatta ? senza +3 ecc... (anche quella però pensandoci non è male...)
Indenti piu` stringhe penso.

Rileggi il mio post precedente, mettile in un file.

Mario Vanoni

Avatar utente
conraid
Staff
Staff
Messaggi: 13630
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

Re: eliminare paragrafo con sed

Messaggio da conraid »

Mario Vanoni ha scritto: Rileggi il mio post precedente, mettile in un file.
Rileggendo il tuo post mi è venuto un dubbio.
tu dici
ATTENTI: con frasi uguali in il_file_che_vuoi, GUAI IN VISTA !!!
e prima
Un file con tutto il testo che vuoi eliminare,
ad ogni riga aggiungi all'inizio
/^
alla fine della riga
$/d
chiamalo magari file.sed
poi
sed -f file.sed il_file_che_vuoi
Se devo specificare riga per riga, mi toglie tutte le righe

Codice: Seleziona tutto

fi
del codice sopra, o sbaglio?

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6629
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: eliminare paragrafo con sed

Messaggio da targzeta »

submax82 ha scritto:...
## Added by Gnome-Slacky 2.20.3 ##
if [ -x /etc/rc.d/rc.gnome ]; then
. /etc/rc.d/rc.gnome
fi
Vuoi eliminare tutte le righe tra "## Added.." e il primo "fi"? Ora ho da fare, se nessuno ti posta la soluzione, più tardi lo faccio io. Si può fare, e sul forum ci dovrebbe essere un altro thread in cui ho dato la stessa risposta. Prova a cercare....

Spina
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6629
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: eliminare paragrafo con sed

Messaggio da targzeta »

La seguente regola, dice a sed di eliminare tutte le righe tra "## Added by Gnome-Slacky 2.20.3 ##" e il primo "fi" che incontra.

Codice: Seleziona tutto

sed -n '/## Added by Gnome-Slacky 2.20.3 ##/{n;b BECCATO;};p;d;:BECCATO /fi/d;;n;b BECCATO' nome_file
Il man dovrebbe essere sufficiente a farti capire la regola, altrimenti chiedi pure. Ricorda che sed è un automa e quindi fa esattamente quello che gli si chiede, l'importante è chiedergli le cose giuste :).

Spina
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama

albatrosla
Packager
Packager
Messaggi: 1339
Iscritto il: sab 27 mar 2004, 0:00
Slackware: current
Desktop: fluxbox.git
Località: Collegno, but made in Friûl
Contatta:

Re: eliminare paragrafo con sed

Messaggio da albatrosla »

E' possibile anche affidandosi a grep per determinare la riga in cui inizia il paragrafo.

Codice: Seleziona tutto

sed -i `grep -n "## Added by Gnome-Slacky 2.20.3 ##"|cut -d':' -f1`,$((`grep -n "## Added by Gnome-Slacky 2.20.3 ##"|cut -d':' -f1` + 3))d nome_file
è chiaro che dipende da quanto sarà diverso quel blocco di codice nelle future implementazioni. Se finirà sempre per "fi" la soluzione di Spina è certamente la migliore, altrimenti puoi optare per qualcosa che individui la sola dimensione del paragrafo a partire dalla sua prima riga. Poi, non sono un coder, ma riconosco che la mia stringa sia inefficiente se quel file è grosso e il paragrafo verso il fondo; in tal caso, scorporata su due comandi è più efficiente:

Codice: Seleziona tutto

n=`grep -n "## Added by Gnome-Slacky 2.20.3 ##"|cut -d':' -f1`
sed -i $n,$((n + 1))d nome_file

Avatar utente
sid77
Linux 3.x
Linux 3.x
Messaggi: 568
Iscritto il: mer 1 giu 2005, 0:00
Slackware: 12.0/12.1/curr (ppc)
Località: PowerPC
Contatta:

Re: eliminare paragrafo con sed

Messaggio da sid77 »

submax82 ha scritto:mi serve nella rimozione di gslacky per rimuovere queste righe da /etc/rc.d/rc.local
in teoria la modifica di rc.local non dovrebbe avvenire esclusivamente per mano dell'amministratore?
se hai bisogno di eseguire degli script all'avvio è decisamente meglio modificare rc.M e presentarlo come rc.M.new (oppure rc.S, ma non credo serva per GNOME ;-) )

ciao

Avatar utente
conraid
Staff
Staff
Messaggi: 13630
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

Re: eliminare paragrafo con sed

Messaggio da conraid »

sid77 ha scritto: in teoria la modifica di rc.local non dovrebbe avvenire esclusivamente per mano dell'amministratore?
se hai bisogno di eseguire degli script all'avvio è decisamente meglio modificare rc.M e presentarlo come rc.M.new (oppure rc.S, ma non credo serva per GNOME ;-) )
al primo aggiornamento di Pat gnome sparisce così :-)
Io non farei niente, creerei un rc.gnome e poi direi all'utente di inserire quelle righe in rc.local, ma al limite mi sembra il luogo adatto visto che è "fuori" dai pacchetti di Slackware base.

Mario Vanoni
Iper Master
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: eliminare paragrafo con sed

Messaggio da Mario Vanoni »

conraid ha scritto:
Mario Vanoni ha scritto: Rileggi il mio post precedente, mettile in un file.
Rileggendo il tuo post mi è venuto un dubbio.
tu dici
ATTENTI: con frasi uguali in il_file_che_vuoi, GUAI IN VISTA !!!
e prima
Un file con tutto il testo che vuoi eliminare,
ad ogni riga aggiungi all'inizio
/^
alla fine della riga
$/d
chiamalo magari file.sed
poi
sed -f file.sed il_file_che_vuoi
Se devo specificare riga per riga, mi toglie tutte le righe

Codice: Seleziona tutto

fi
del codice sopra, o sbaglio?
Esatto, per questo l'"ATTENTI"!

O le frasi sono _uniche_, o sono GUAI.

Quindi vecchia e buona regola commentare anche il/lo "fi"
fi ## Added by ... ##
ed in C
fi /* if (quello_che vuoi == 0) */

Mario Vanoni

Rispondi