[X-POST] Sostituzione stringa in file [messaggio #122396] |
lun, 26 settembre 2011 12:58 |
Gandalf Corvotempesta Messaggi: 2 Registrato: settembre 2011 |
Junior Member |
|
|
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.
|
|
|
Re: [X-POST] Sostituzione stringa in file [messaggio #122397 è una risposta a message #122396] |
lun, 26 settembre 2011 13:23 |
Leonardo Serni Messaggi: 3 Registrato: giugno 2011 |
Junior Member |
|
|
On Mon, 26 Sep 2011 12:58:12 +0200, Gandalf Corvotempesta
<gandalf.corvotempesta@gmail.com> wrote:
>Come posso effettuare questa sostituzione visto che ${stringa} sarà
>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'.
|
|
|
|
|
Re: Sostituzione stringa in file [messaggio #124385 è una risposta a message #122448] |
ven, 30 settembre 2011 23:08 |
Marco Messaggi: 226 Registrato: giugno 2007 |
Senior Member |
|
|
On Mon, 26 Sep 2011 05:17:38 -0700 (PDT), Gandalf Mithrandir
<gandalf.corvotempesta@gmail.com> wrote:
> On 26 Set, 13:23, Leonardo Serni <ser...@tin.it> wrote:
> > 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
>
>
> 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?
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'.
|
|
|