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

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
Linpassion
Linux 2.x
Linux 2.x
Messaggi: 208
Iscritto il: mar ott 30, 2012 11:17
Slackware: 14.0
Kernel: 3.2.9-smp
Desktop: xfce, fluxbox

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

Messaggioda Linpassion » ven set 11, 2015 19:08

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

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

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

Messaggioda conraid » sab set 12, 2015 11:05

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...

Avatar utente
Linpassion
Linux 2.x
Linux 2.x
Messaggi: 208
Iscritto il: mar ott 30, 2012 11:17
Slackware: 14.0
Kernel: 3.2.9-smp
Desktop: xfce, fluxbox

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

Messaggioda Linpassion » sab set 12, 2015 11:10

mi funziona cosi sed .i "s@var1@ver2@" che pero sposta la veccia riga in fondo alla nuova... :shock:
Ultima modifica di Linpassion il sab set 12, 2015 12:17, modificato 1 volta in totale.

hashbang
Packager
Packager
Messaggi: 1975
Iscritto il: ven giu 04, 2010 10:27
Nome Cognome: Luca De Pandis
Distribuzione: macOS Catalina
Località: Lecce / Bergamo / Milano
Contatta:

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

Messaggioda hashbang » sab set 12, 2015 11:21

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.

Avatar utente
brg
Linux 2.x
Linux 2.x
Messaggi: 467
Iscritto il: sab mar 12, 2011 14:20
Slackware: 14.2
Kernel: 4.4.172
Desktop: KDE4
Località: Montecatini
Contatta:

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

Messaggioda brg » dom set 13, 2015 17:14

Io in questi casi uso Perl, che è un vero linguaggio di programmazione ed è specificatamente indicato per questo tipo di operazioni.

Avatar utente
Linpassion
Linux 2.x
Linux 2.x
Messaggi: 208
Iscritto il: mar ott 30, 2012 11:17
Slackware: 14.0
Kernel: 3.2.9-smp
Desktop: xfce, fluxbox

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

Messaggioda Linpassion » dom set 13, 2015 19:23

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