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.
Rispondi
Avatar utente
Linpassion
Linux 2.x
Linux 2.x
Messaggi: 223
Iscritto il: mar 30 ott 2012, 11:17
Slackware: 14.2
Desktop: xfce, fluxbox

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

Messaggio 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

Avatar utente
conraid
Staff
Staff
Messaggi: 13474
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******

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

Avatar utente
Linpassion
Linux 2.x
Linux 2.x
Messaggi: 223
Iscritto il: mar 30 ott 2012, 11:17
Slackware: 14.2
Desktop: xfce, fluxbox

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

Messaggio da Linpassion »

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 12 set 2015, 12:17, modificato 1 volta in totale.

hashbang
Packager
Packager
Messaggi: 1992
Iscritto il: ven 4 giu 2010, 10:27
Nome Cognome: Luca De Pandis
Distribuzione: macOS | OpenBSD
Località: Lecce / Bergamo
Contatta:

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

Messaggio 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.
k8s | rook | flatcar | cert-manager | calico

Codice: Seleziona tutto

host$ kubectl get packager/hashbang -n slacky -o yaml

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

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

Messaggio da brg »

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: 223
Iscritto il: mar 30 ott 2012, 11:17
Slackware: 14.2
Desktop: xfce, fluxbox

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

Messaggio 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

Rispondi