sed e una mazata seulle p******
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.
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.
- Linpassion
- Linux 2.x
- Messaggi: 336
- Iscritto il: mar 30 ott 2012, 11:17
- Slackware: 14.2
- Desktop: xfce, fluxbox
sed e una mazata seulle p******
Ragazzi dunque sto creando uno script per installare i miei temi fluxbox. Ora non riesco a usare le variabili con sed, x sostituire la s tringa del nuovo tema nello startup di fluxbox. ho provato di tutto singolo apice, doppi apici ecc... allego il codice maleficus
function ENABLE (){
Xdialog --dselect $HOME/.FluxPrime 40 100 2>/tmp/output
NEWT=`cat /tmp/output`
OLDT=`grep '$HOME' $HOME/.fluxbox/startup`
echo "old.. $OLDT --- new.. $NEWT" #test
sed 's/"$OLDT"/"$NEW"/' $HOME/.fluxbox/startup $HOME/.fluxbox/temp
mv $HOME/.fluxbox/temp $HOME/.fluxbox/startup
}
NEWT contine l'output della finestra
OLDT contine la stringa col vecchio nome
con sed dovrei sostituire la nuava stringaa con la vecchia...
non ci sto capendo piu na mazza, ho provato tutti gli esempi nel web, anche i doppi apici x le variabili
function ENABLE (){
Xdialog --dselect $HOME/.FluxPrime 40 100 2>/tmp/output
NEWT=`cat /tmp/output`
OLDT=`grep '$HOME' $HOME/.fluxbox/startup`
echo "old.. $OLDT --- new.. $NEWT" #test
sed 's/"$OLDT"/"$NEW"/' $HOME/.fluxbox/startup $HOME/.fluxbox/temp
mv $HOME/.fluxbox/temp $HOME/.fluxbox/startup
}
NEWT contine l'output della finestra
OLDT contine la stringa col vecchio nome
con sed dovrei sostituire la nuava stringaa con la vecchia...
non ci sto capendo piu na mazza, ho provato tutti gli esempi nel web, anche i doppi apici x le variabili
- conraid
- Staff
- Messaggi: 13630
- Iscritto il: gio 14 lug 2005, 0:00
- Nome Cognome: Corrado Franco
- Slackware: current64
- Desktop: kde
- Località: Livorno
- Contatta:
Re: sed e una mazata seulle p******
Le virgolette le devi mettere nell'espressione di sed, altrimenti non espande le variabili.
Cioè tenendo conto che
PIPPO=casa
PLUTO=giostra
Ed il file è
La casa è rossa.
sed 's/$PIPPO/$PLUTO/'
non sostituirà nulla, perché cerca la stringa $PIPPO, anzi $ è fine riga tra l'altro.
devi usare
sed "s/$PIPPO/$PLUTO/"
ecco che allora la shell darà in pasto a sed l'espressione
s/casa/giostra/
mettere poi tra virgolette le variabili dentro l'espressione non serve a niente, serve solo a cercare la stringa ", quindi devi usarlo solo se ti serve fare ciò. Poi guardando di sfuggita il tuo codice mi sa che devi anche stare attento ai newline, etc...
Cioè tenendo conto che
PIPPO=casa
PLUTO=giostra
Ed il file è
La casa è rossa.
sed 's/$PIPPO/$PLUTO/'
non sostituirà nulla, perché cerca la stringa $PIPPO, anzi $ è fine riga tra l'altro.
devi usare
sed "s/$PIPPO/$PLUTO/"
ecco che allora la shell darà in pasto a sed l'espressione
s/casa/giostra/
mettere poi tra virgolette le variabili dentro l'espressione non serve a niente, serve solo a cercare la stringa ", quindi devi usarlo solo se ti serve fare ciò. Poi guardando di sfuggita il tuo codice mi sa che devi anche stare attento ai newline, etc...
- Linpassion
- Linux 2.x
- Messaggi: 336
- Iscritto il: mar 30 ott 2012, 11:17
- Slackware: 14.2
- Desktop: xfce, fluxbox
Re: sed e una mazata seulle p******
mi funziona cosi sed .i "s@var1@ver2@" che pero sposta la veccia riga in fondo alla nuova...
Ultima modifica di Linpassion il sab 12 set 2015, 12:17, modificato 1 volta in totale.
Re: sed e una mazata seulle p******
Sinceramente il sed è l'ultimo dei problemi in quella funzione.
1) Quando scrivi codice usa il tag code, per favore.
2) Quella funzione lì è in dialetto Bash e non in strictly POSIX, quindi perché dare uno scope globale a $OLDT e $NEWT quando potrebbero benissimo essere dichiarate come variabili locali?
3) Xdialog ritorna il percorso completo della directory stampando in /dev/stderr. Perché reindirizzarlo in un file in /tmp che poi parsi con cat? A che pro? Perché non usi la ridirezione di /dev/stderr in /dev/stdout così da assegnarlo direttamente in una variabile?
Regola UNIX: Mai chiamare processi quando non è realmente necessario, perché perdi in efficienza.
4) Quel sed messo così non ha il minimo senso. Per tre motivi:
4.1) Innanzi tutto dove sta $NEW? Io vedo solo $OLDT e $NEWT. È un typo? O è un'altra variable con scope globale che tu hai messo in una funzione?
4.2) Perché creare il file temp che poi vai a sostituire a startup? Modifica direttamente startup, no? Avrei potuto capire se l'avessi usato a mo' di backup (e nemmeno visto che usi un mv subito dopo anziché un cp), ma in quel caso sed ti offre già dei modi per salvare l'originale.
4.3) I singole quote ' prevengono l'espansione di variabili e sequenze di escape.
Se tu digiti '"$NEW"' stai dicendo che la stringa da sostituire/cercare è "$NEW" (doppi apici inclusi).
Per risolvere o usi la sequenza escape ai path "\/" (senza doppi apici) oppure usa un delimitatore diverso su sed.
Questa è come avrei scritto io la tua funzione.
EDIT: Aggiungo, i singoli apici a $HOME presenti nella chiamata a grep li ho lasciati perché ho ipotizzato che tu stessi cercando proprio $HOME all'interno del file startup.
Chiaramente, se devi cercarne il contenuto vale quanto detto nel punto 4.3
EDIT2: Xdialog supporta la ridirezione automatica con --stdout, quindi puoi pure usare il parametro diretto. Ho modificato la funzione.
1) Quando scrivi codice usa il tag code, per favore.
2) Quella funzione lì è in dialetto Bash e non in strictly POSIX, quindi perché dare uno scope globale a $OLDT e $NEWT quando potrebbero benissimo essere dichiarate come variabili locali?
3) Xdialog ritorna il percorso completo della directory stampando in /dev/stderr. Perché reindirizzarlo in un file in /tmp che poi parsi con cat? A che pro? Perché non usi la ridirezione di /dev/stderr in /dev/stdout così da assegnarlo direttamente in una variabile?
Regola UNIX: Mai chiamare processi quando non è realmente necessario, perché perdi in efficienza.
4) Quel sed messo così non ha il minimo senso. Per tre motivi:
4.1) Innanzi tutto dove sta $NEW? Io vedo solo $OLDT e $NEWT. È un typo? O è un'altra variable con scope globale che tu hai messo in una funzione?
4.2) Perché creare il file temp che poi vai a sostituire a startup? Modifica direttamente startup, no? Avrei potuto capire se l'avessi usato a mo' di backup (e nemmeno visto che usi un mv subito dopo anziché un cp), ma in quel caso sed ti offre già dei modi per salvare l'originale.
4.3) I singole quote ' prevengono l'espansione di variabili e sequenze di escape.
Se tu digiti '"$NEW"' stai dicendo che la stringa da sostituire/cercare è "$NEW" (doppi apici inclusi).
Quello ti succede perché stai tentando di mandare in sed due path che contengono naturalmente dei /, mandandolo quindi in confusione.con sed "s/$var1/$var2/" file>tem
ho questo messaggio:
sed: -e expression #1, char 20: unknown option to `s'
Per risolvere o usi la sequenza escape ai path "\/" (senza doppi apici) oppure usa un delimitatore diverso su sed.
Questa è come avrei scritto io la tua funzione.
Codice: Seleziona tutto
function enable {
local -r newt=$(Xdialog --stdout --dselect $HOME/.FluxPrime 40 100)
local -r oldt=$(grep '$HOME' $HOME/.fluxbox/startup)
sed -i -e "s|$oldt|$newt|" $HOME/.fluxbox/startup # usa -i.orig se vuoi salvare una copia di backup
echo "old.. $oldt --- new.. $newt" #test
}
EDIT: Aggiungo, i singoli apici a $HOME presenti nella chiamata a grep li ho lasciati perché ho ipotizzato che tu stessi cercando proprio $HOME all'interno del file startup.
Chiaramente, se devi cercarne il contenuto vale quanto detto nel punto 4.3
EDIT2: Xdialog supporta la ridirezione automatica con --stdout, quindi puoi pure usare il parametro diretto. Ho modificato la funzione.
- brg
- Linux 3.x
- Messaggi: 580
- Iscritto il: sab 12 mar 2011, 14:20
- Slackware: 15.0
- Kernel: 5.15.117
- Desktop: KDE5
- Località: Montecatini
- Contatta:
Re: sed e una mazata seulle p******
Io in questi casi uso Perl, che è un vero linguaggio di programmazione ed è specificatamente indicato per questo tipo di operazioni.
- Linpassion
- Linux 2.x
- Messaggi: 336
- Iscritto il: mar 30 ott 2012, 11:17
- Slackware: 14.2
- Desktop: xfce, fluxbox
Re: sed e una mazata seulle p******
hashbang ha scritto:Sinceramente il sed è l'ultimo dei problemi in quella funzione.
1) Quando scrivi codice usa il tag code, per favore.
2) Quella funzione lì è in dialetto Bash e non in strictly POSIX, quindi perché dare uno scope globale a $OLDT e $NEWT quando potrebbero benissimo essere dichiarate come variabili locali?
3) Xdialog ritorna il percorso completo della directory stampando in /dev/stderr. Perché reindirizzarlo in un file in /tmp che poi parsi con cat? A che pro? Perché non usi la ridirezione di /dev/stderr in /dev/stdout così da assegnarlo direttamente in una variabile?
Regola UNIX: Mai chiamare processi quando non è realmente necessario, perché perdi in efficienza.
4) Quel sed messo così non ha il minimo senso. Per tre motivi:
4.1) Innanzi tutto dove sta $NEW? Io vedo solo $OLDT e $NEWT. È un typo? O è un'altra variable con scope globale che tu hai messo in una funzione?
4.2) Perché creare il file temp che poi vai a sostituire a startup? Modifica direttamente startup, no? Avrei potuto capire se l'avessi usato a mo' di backup (e nemmeno visto che usi un mv subito dopo anziché un cp), ma in quel caso sed ti offre già dei modi per salvare l'originale.
4.3) I singole quote ' prevengono l'espansione di variabili e sequenze di escape.
Se tu digiti '"$NEW"' stai dicendo che la stringa da sostituire/cercare è "$NEW" (doppi apici inclusi).
Quello ti succede perché stai tentando di mandare in sed due path che contengono naturalmente dei /, mandandolo quindi in confusione.con sed "s/$var1/$var2/" file>tem
ho questo messaggio:
sed: -e expression #1, char 20: unknown option to `s'
Per risolvere o usi la sequenza escape ai path "\/" (senza doppi apici) oppure usa un delimitatore diverso su sed.
Questa è come avrei scritto io la tua funzione.
Codice: Seleziona tutto
function enable { local -r newt=$(Xdialog --stdout --dselect $HOME/.FluxPrime 40 100) local -r oldt=$(grep '$HOME' $HOME/.fluxbox/startup) sed -i -e "s|$oldt|$newt|" $HOME/.fluxbox/startup # usa -i.orig se vuoi salvare una copia di backup echo "old.. $oldt --- new.. $newt" #test }
EDIT: Aggiungo, i singoli apici a $HOME presenti nella chiamata a grep li ho lasciati perché ho ipotizzato che tu stessi cercando proprio $HOME all'interno del file startup.
Chiaramente, se devi cercarne il contenuto vale quanto detto nel punto 4.3
EDIT2: Xdialog supporta la ridirezione automatica con --stdout, quindi puoi pure usare il parametro diretto. Ho modificato la funzione.
Alp perché la rsposta é semplice!!! Non sono esperto e aktri modi non ne conoscevo. comunque graziue