Newsgroup: it.comp.os.linux.sys
Titolo: [X-POST] Sostituzione stringa in file

Supponiamo di avere un file con dentro un placeholder di questo tipo:
 
##UTENTE##
 
Supponiamo anche di avere uno script che elabora dei dati e se li
ritrova in
 
stringa=$(cat /file)
 
ho la necessità di mettere ${stringa} al posto del placeholder.
 
Considerato che ${stringa} conterrà i peggiori caratteri, non
posso usare "normalmente" sed, in quando la regex sicuramente si
spaccherà grazie al contenuto di ${stringa}
 
Come posso effettuare questa sostituzione visto che ${stringa} sarà
un qualcosa di molto, molto lungo e con varie schifezze al suo interno?
 
 
-- 
Non tocca a noi dominare tutte le maree del mondo,
il nostro compito è di fare il possibile per la
salvezza degli anni nei quali viviamo,
sradicando il male dai campi che conosciamo.

un qualcosa di molto, molto lungo e con varie schifezze al suo interno?
 
sed -e "s/##UTENTE##/##SEGNAPOSTOPRIMA##\n##SEGNAPOSTODOPO##/g" \
	< input \
	| sed -e "/##SEGNAPOSTOPRIMA##/r sourcefile"  \
	| sed -e ':a;N;$!ba;s/\n*##SEGNAPOSTO[A-Z]*##\n*//g' \
	> output
 
**Non** e' il sistema migliore[1], ma volevo farlo con sed :-D
 
Leonardo
 
[1] che è Perl. Per es. il terzo sed si mangia un mondo di memoria, non
    usare questo script se il file di origine e' molto grosso. Esistono
    sistemi di templating migliori.
 
-- 
Surstangas via akcipitr', la ceval' fojnumas nur:
Jen vigla damo en brakum', kaj vi pensas pri forkur'?
Do li turnis sin, kaj turnis sin, kaj ekdormis sen singard';
Kaj lin apudis je l' vekigx, soldatoj kaj Barnard'.

 **Non** e' il sistema migliore[1], ma volevo farlo con sed :-D
Ho trovato una soluzione migliore, direttamente in bash.
#!/bin/bash
origine="$(cat prova.txt)"
replace="$(cat prova_new.txt)"
echo "${origine//--PLACEHOLDER--/$replace}"


 **Non** e' il sistema migliore[1], ma volevo farlo con sed :-D
 
 
oooooohhhhhhhh, stupore immenso, non ci sarei mai arrivato.
Presumo si possa anche rimuovere il primo sed, se nel file di template
mettessi da subito il doppio placeholder (inizio/fine)
 
Ma possibile che in uno script bash non sia possibile fare il replace
di
una stringa senza usare sed o altri software complicandosi la vita con
escape e cose simili?

echo "${origine//--PLACEHOLDER--/$replace}"
 
Boja...!, non la sapevo mica questa potenza di bash 8-OOO
 
Leonardo bas(h)ito


 Boja...!, non la sapevo mica questa potenza di bash 8-OOO
 
Nemmeno io.
La figata è che devi fare zero escape.


 stringa=$(cat /file)
 
Ora arriva malin e senti...(:

 Ora arriva malin e senti...(:
 
Perchè ?


 Perchè ?
 
http://bit.ly/qRg1bP
 
 
"Mettere il contenuto di un file in una variabile non
e` un metodoo generale di procedere, anzi non e` ne`
corretto ne` intelligente."
 
:-P

 :-P
 
[ modalità arrampicata sugli specchi ON ]
    il mio era solo un esempio...
[ modalità arrampicata sugli specchi OFF ]
 
A dire il vero, non saprei fare diversamente.



Con awk devi solo fare l'escape dei & (se ne hai, altrimenti niente):
 
awk -v s="${stringa//&/\\\\&}" '{gsub(/##UTENTE##/, s); print}'
 
Se lo vuoi fare tutto in bash:
 
while IFS= read -r line; do
  line=${line//##UTENTE##/"$stringa"}
  printf '%s\n' "$line"
done < file
 
 
Per cose piu' complesse, ci sono n-mila sistemi di templating.
 
-- 
Cio' che si vede, e'.