Pagina 1 di 1

sed e una mazata seulle p******

Inviato: ven 11 set 2015, 19:08
da Linpassion
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 :lol: :lol: :lol:

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

Re: sed e una mazata seulle p******

Inviato: sab 12 set 2015, 11:05
da conraid
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...

Re: sed e una mazata seulle p******

Inviato: sab 12 set 2015, 11:10
da Linpassion
mi funziona cosi sed .i "s@var1@ver2@" che pero sposta la veccia riga in fondo alla nuova... :shock:

Re: sed e una mazata seulle p******

Inviato: sab 12 set 2015, 11:21
da hashbang
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).
con sed "s/$var1/$var2/" file>tem

ho questo messaggio:

sed: -e expression #1, char 20: unknown option to `s'
Quello ti succede perché stai tentando di mandare in sed due path che contengono naturalmente dei /, mandandolo quindi in confusione.
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.

Re: sed e una mazata seulle p******

Inviato: dom 13 set 2015, 17:14
da brg
Io in questi casi uso Perl, che è un vero linguaggio di programmazione ed è specificatamente indicato per questo tipo di operazioni.

Re: sed e una mazata seulle p******

Inviato: dom 13 set 2015, 19:23
da Linpassion
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).
con sed "s/$var1/$var2/" file>tem

ho questo messaggio:

sed: -e expression #1, char 20: unknown option to `s'
Quello ti succede perché stai tentando di mandare in sed due path che contengono naturalmente dei /, mandandolo quindi in confusione.
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