Newsgroup: it.comp.os.linux.sys
Titolo: sed e escaping

Penso che la cosa farà sorridere qualcuno, ma ho un problema un poco 
cretino (forse...)
Sto giocherellando su di una installazione semi-automatizzata di tripwire.
Il problema che incontro è questo:
Nel momento in cui lo lancio per la prima volta, tripwire mi spara tutta 
una lista in stderr in cui mi dice tutti i files che non trova.
Quello che vorrei fare è: "greppare" tutte le linee di errore che 
contengono i path errati e, tramite sed, spararle in una pipe(o, meglio, 
un file temporaneo) dove mi arrivano soltanto i path in questione, nudi 
e crudi.
Dopodichè piglio questo file e, per ogni riga (che è, appunto, solo un 
path), andare a cercare la riga del twpol.txt che la contiene e commentarla.
Il problema viene qui: come farlo con sed?
mi spiego meglio:
se faccio un cat vecchiofile | sed s/pippo/pluto/ è tutto ok.
Se faccio un cat vecchiofile | sed s/$pippo/$pluto/ , allora iniziano i 
problemi:
dato che dal file "delle path" prendo le righe in automatico una alla 
volta, assegnandole ad una variabile, la sostituzione la devo fare 
partendo dalla variabile stessa. Ma dato che questa contiene un path, 
devo avere la possibilità di "escapare" (mi si passi il termine 
ignobile) i caratteri contenuti nella variabile stessa di fronte ai 
quali sed si inalbera (e trattandosi di path, con un sacco di "/", sono 
tanti.. :-P )...
Qualcuno ha un'idea da proporre?
Grazie mille per l'aiuto...
Byez...
-- 
Emanuele "SKULL" Balla
----------------------------------------------------------------------
"How should I know if it works?  That's what beta testers are for. I 
only coded it." (Attributed to Linus Torvalds, somewhere in a posting)

 Qualcuno ha un'idea da proporre?
Usa Perl. Puoi specificare tu quale e' il carattere di 'suddivisione'
della regex, quindi potresti usare | invece di / e risolvere il problema
in un colpo solo.
Davide

 problemi:
[...]
cat vecchiofile | sed s/${pippo//\//\\/}/${pluto//\//\\/}/
Ammetto che non sarà facile ricopiarla correttamente senza usare il
copia/incolla. :-)
-- 
Saluti,
    Mardy
http://castellina.org/interlingua

 in un colpo solo.
Anche con sed si può fare:
$ tail /var/log/messages | sed s@May@Maggio@
-- 
"Wendy, tesoro, luce della mia vita! Non ti faro' niente. Solo che devi
lasciarmi finire la frase. Ho detto che non ti faro' niente.
Soltanto, quella testa te la spacco in due, quella tua testolina te la
faccio a pezzi!"             -- Mr. Jack Torrance, "Shining"


Prima di ammettere che non mi funziona, vorrei capire la logica che sta 
dietro a questa stringa, forse capisco dove sbaglio :-)
Intanto, grazie mille per l'aiuto....



Ok, come non detto, adesso ha funzionato, ma la logica ancor mi sfugge :-)


 Ok, come non detto, adesso ha funzionato, ma la logica ancor mi sfugge :-)
man bash, paragrafetto "Parameter Expansion", voce:
${parameter//pattern/string}
In pratica, si dice a bash di espandere $pippo e $pluto sostituendo alle
"/" (che sono scritte "\/", dove la "\" serve come escape) la stringa
"\/" (che è scritta "\\/", il solito escape). Le due forme espanse si
passano poi a sed.


 problemi:                          ^^^^^^^^^^^^^^^^
Spero che questo lo fai in uno script, altrimenti non cavi un ragno
dal buco (nella bash (o meglio nelle regexp) con il simbolo $ viene
indicata la fine della riga). Cmq puoi fare benissimo cosi`:
$ cat vecchiofile | sed 's§$pippo/§$pluto/§'
Henryx