Pagina 1 di 2

eliminare paragrafo con sed

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