Pagina 1 di 2

eliminare paragrafo con sed

Inviato: mar gen 22, 2008 14:59
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...

Re: eliminare paragrafo con sed

Inviato: mar gen 22, 2008 15:38
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

Re: eliminare paragrafo con sed

Inviato: mar gen 22, 2008 18:21
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?

Re: eliminare paragrafo con sed

Inviato: mar gen 22, 2008 19:23
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

Re: eliminare paragrafo con sed

Inviato: mar gen 22, 2008 21:55
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...

Re: eliminare paragrafo con sed

Inviato: mar gen 22, 2008 22:18
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

Re: eliminare paragrafo con sed

Inviato: mar gen 22, 2008 22:35
da submax82
non c'è una soluzione che mi permette di indicare proprio la stringa esatta ? senza +3 ecc... (anche quella però pensandoci non è male...)

Re: eliminare paragrafo con sed

Inviato: mar gen 22, 2008 22:51
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

Re: eliminare paragrafo con sed

Inviato: mar gen 22, 2008 22:55
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?

Re: eliminare paragrafo con sed

Inviato: mer gen 23, 2008 7:33
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

Re: eliminare paragrafo con sed

Inviato: mer gen 23, 2008 8:00
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

Re: eliminare paragrafo con sed

Inviato: mer gen 23, 2008 9:41
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

Re: eliminare paragrafo con sed

Inviato: mer gen 23, 2008 12:23
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

Re: eliminare paragrafo con sed

Inviato: mer gen 23, 2008 12:29
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.

Re: eliminare paragrafo con sed

Inviato: mer gen 23, 2008 14:37
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