Newsgroup: it.comp.os.linux.sys
Titolo: Qual'e' il modo piu' elegante per...

...inserire all'interno di un testo, un altro blocco di testo, pero' deve 
posizionarsi in mezzo a due righe specifiche.
Per esempio in un testo ogni volta che incontro una riga xxx e subito dopo 
una riga yyy, li in mezzo ci devo piazzare il mio blocco. 

 sed
k, riformulo la domanda:
Qual'e' il modo piu' elegante di usare sed per risolvere il mio problema? 
^__^

 Qual'e' il modo piu' elegante di usare sed per risolvere il mio problema? 
s/xxx/xxx\zzz/
-- 
Flavio Visentin
Membro del CICAP
Comitato Italiano per il Controllo delle Affermazioni di P4

 s/xxx/xxx\zzz/
dimenticato la "n":
/xxx/xxx\nzzz/


 /xxx/xxx\nzzz/
mmm
ma visto che parlava di yyy, magari non vuole mettere le zzz quando dopo xxx
c'e' altro :D
$ echo 'xxx
www
xxx
yyy
xxx
yyy
xxx' | sed 'N;s/\(xxx\)\n\(yyy\)/\1zzz\2/g'
xxx
www
xxxzzzyyy
xxxzzzyyy
xxx
-- 
Under construction

 sed
Se avessi letto bene il problema non 
avresti detto sed.
Il probela e` trovare un riga xxx seguita
da una riga yyy e poi inserire tra queste...
Qui e` il problema, un riferimento all'
indietro, uno dei punti deboli di sed.
Non dico che non sia possibile farlo con 
sed ma richiede l'uso di trucchetti non 
elementari e di sicuro la soluzione non 
risultera` ne` semplice ne` elegante.
Io mi orienterei su awk.

 ... sed 'N;s/\(xxx\)\n\(yyy\)/\1zzz\2/g'
Ovviamente volevi dire:
sed 'N;s/\(xxx\)\n\(yyy\)/\1\nzzz\n\2/'
Pero` il problema di questa espressione 
e che funziona con il GNU sed, non credo 
che funzioni con altre versioni di sed.

 ... sed 'N;s/\(xxx\)\n\(yyy\)/\1zzz\2/g'
Ovviamente volevi dire:
sed 'N;s/\(xxx\)\n\(yyy\)/\1\nzzz\n\2/'
Pero` il problema di questa espressione 
e che funziona (ed anche male) con il 


 e che funziona (ed anche male)
scusa l'ignoranza ma, nello specifico, che problemi ha?
-- 
Under construction

 scusa l'ignoranza ma, nello specifico, che problemi ha?
$ cat pippo
xxx
yyy
abc
xyz
xxx
yyy
xxx
yyy
xxx
yyyxxx
yyy
xxx
yyy
abc
qwertyxxx
yyy
$ sed 'N;s/\(xxx\)\n\(yyy\)/\1\nzzz\n\2/' pippo
xxx
zzz
yyy
abc
xyz
xxx
zzz
yyy
xxx
zzz
yyy
xxx
zzz
yyyxxx
yyy
xxx
yyy
abc
qwertyxxx
zzz
yyy
$ 
Spero di aver chiarito.

 Spero di aver chiarito.
spè, intendevi questo?
$ echo 'xxx
yyyxxx
yyyxxx
yyy' | sed 'N;s/\(xxx\)\n*\(yyy\)/\1\nzzz\n\2/g'
xxx
zzz
yyyxxx
yyyxxx
zzz
yyy
$
cioè che se xxx è presente subito dopo un yyy "già usato", la sostituzione
non avviene?
che sed abbia limiti è ovvio, sta da vedere se le esigenze dell'OP rientrano
in questi limiti :D
(per curiosità: che soluzione sarebbe stata fatta, in awk? e come questa
avrebbe superato questo limite?)
-- 
Under construction

 
#! /bin/awk -f
{
 while (/xxx/)
  {
   print $0
   if (getline)
    {
     /yyy/
       printf "zzz\n";
    }
  }
}
{print}

Scusate i vari refusi e la mancanza del else
Lo script corretto e`
#! /bin/awk -f
{
 while (/xxx/)
  {
   print $0
   if (getline)
    {
     /yyy/
       printf "zzz\n";
    }
   else exit 0
  }
}
{print}

 risultera` ne` semplice ne` elegante.
Ammetto di aver letto male, intendendo "trovare una stringa xxx e immetterci
dopo una stringa yyy", nel qual caso sed è la soluzione più rapida. Ma il
problema era differente :P
-- 
Vide

 il mio problema? ^__^
Devo ammettere di aver sbagliato completamente.
In effetti usando GNU sed ho trovato una soluzione 
molto semplice
sed  '/xxx/,+1 s/yyy/zzz\n&/' file
Non credo che possa esistere una cosa piu` 
semplice ed elegante :( 
Il suo unico difetto: funziona solo per la
versione GNU di sed,
A voi la parola, oggi ho sbagliato troppe volte.

Davide D'Amico wrote:

Se il testo non è troppo grande
--- inizio script
#! /usr/bin/env python
fileOrg = 'origine.txt'
fileDes = 'destinazione.txt'
vecchioTesto = 'xxx\nyyy\n'
blocco = 'il mio blocco\n'
nuovoTesto = 'xxx\n%syyy\n' % blocco
buff = file(fileOrg).read()
newBuff = buff.replace(vecchioTesto,nuovoTesto)
file(fileDes,'wt').write(newBuff)
--- fine script
altrimenti puoi leggere una riga alla volta ed il file può essere grande
quanto vuoi:
--- inizio script
#! /usr/bin/env python
fileOrg = 'origine.txt'
fileDes = 'destinazione.txt'
line1 = 'xxx\n'
line2 = 'yyy\n'
blocco = 'il mio blocco\n'
nuovoTesto = 'xxx\n%syyy\n' % blocco
fout = file(fileDes,'w')
okLine1 = False
for linea in file(fileOrg):
    if linea==line1: okLine1=True
    elif linea==line2 and okLine1:
        okLine1 = False
        fout.write(blocco)
    else: okLine1 = False
    fout.write(linea)
fout.close()
--- fine script
Ciao

 Ciao
Ringrazio tutti per le risposte. La soluzione migliore mi sembra quella di 
awk, infatti ho usato quella e mi trovo bene cosi'.
Tnx.