Newsgroup: it.comp.os.unix
Titolo: AIUTO! sostituzione di stringhe in un testo....

C'e' qualcuno che conosce a sufficienza Vi, oppure
AWK, SED, ecc. per aiutarmi?
Ho un file ascii in cui ricorre per migliaia di volte
una coppia di stringhe del tipo:
INITIAL xyzw
dove xyzw è una stringa numerica, di lunghezza
variabile.
Ad esempio:
INITIAL 104956
INITIAL 2459
INITIAL 102400000
Purtroppo queste coppie sono 'immerse' nel testo in
posizioni variabili, e non all'inizio di ogni riga.
Il mio scopo è di sostituire ogni coppia con questa:
INITIAL 5M
(esattamente questa, e null'altro)
in tutto il file.
In altre parole: sostituzione di due stringhe (la
prima fissa, separate da blank) con altre due stringhe
fisse (anch'esse separate da blank).
Come cavolo si potrebbe fare?
Grazie infinite!  E buona Pasqua....
:)
______________________________________________________________________
Do You Yahoo!?
Il tuo indirizzo gratis e per sempre @
yahoo.it
 su 
http://mail.yahoo.it
-- 
Posted from 
web1106.mail.yahoo.com
 [128.11.23.126] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 (esattamente questa, e null'altro)
SED:
sed -e 's/ INITIAL [0-9]* / INITIAL 5M /' ....
VI
comandi da dare appena aperto il file (nell'ordine)
:map , .nw
:map ; ,,,,,,,,,,
:map <F1> ;;;;;;;;;;
 
/INITIAL [0-9]<cr>
cw5M<esc>
n
A questo punto non ti resta che usare il tasto:	<F1>
-- 
Mario Michele Macaluso     -o)  | "People should have access to the data     
m.macaluso .@. 
libero.it
   /\\  | which you have about them.  There should   
                          _\\_v | be a process for them to challenge any     
                                | inaccuracies." -- Arthur Miller            
Kernel 2.2.14-5.0 on a i586     |                                            
(All addresses in headers are fake. Only one dot in signature.)


perl -pi -e 's|INITIAL \d+|INITIAL 5M|g' file
-- 
giu...@pobox.com

 writes:
ADP> INITIAL xyzw
ADP> dove xyzw è una stringa numerica, di lunghezza
ADP> variabile.
Ti occorrono queste due linee di comando :
sed "s/INITIAL [0-9]*/INITIAL 5M/g" < inputfile > outputfile
man sed
Per le regexp io ti rimanderei agli info dentro Emacs, ma forse c'è anche
altro on line...
--
Gian Uberto| main(){printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
Lauri      |                        David Korn, 1987 ioccc best one liner 
(aka saint)|-------------------------------------------------------------------
em@ail: 
sa...@eng.it
 ( vedere X-nospam nello header - see X-nospam in header )

 (esattamente questa, e null'altro)
Se e' una cosa ripetitiva, non so aiutarti direttamente,  ho pochissima
pratica col sed (ev. man sed, dovresti riuscirci.)
Se devi farlo solo una volta, puoi usare il vi nel modo che ti dico (non
molto evoluto, ma mi sembra di capire che hai una certa urgenza...).
NB: Il consiglio vale se vuoi sostituire OGNI occorrenza di INITIAL e la
parola successiva (cioe', se volessi sostituire solo INITIAL + stringa
numerica, lasciando inalterato INITIAL +  stringa non numerica, dovresti
fare una ricerca di stringa piu' precisa).
NB: mi riferisco a HP-UX
Praticamente devi
    Associare a un tasto una macro di vi che:
    ti cerchi la stringa INITIAL,
    sostituisca le prossime due parole con INITIAL 5M
    e ripeta.
Apri il file con vi e definisci la macro con la seguente combinazione di
tasti
esc     per passare al modo comandi
: map g /INITIAL2cwINITIAL 5Mctrl-vesc/INITIAL2cwINITIAL
5Mctrl-vesc/INITIAL2cwINITIAL 5Mctrl-vescesc
Spiegazioni  (doverose)
: map g  definisce la macro e la associa al tasto g
/INITIAL     trova la stringa
2cw               cambia le prossime 2 parole
INITIAL 5M   parole che vuoi inserire
ctrl-v             sta per control + v , segnala che il prossimo esc e'
interno alla macro e non ferma la sequenza.
esc                    il tasto esc
questa sequenza va introdotta esattamente come scritta, senza spazi, e
provoca ad ogni pressione di g la ricerca e sostituzione; si puo'
concatenarla in modo che faccia piu' sostituzioni, nel mio esempio 3,
terminandola alla fine con un ulteriore esc come nell esempio
Se vuoi, puoi definire un'altro tasto che ti ripeta n volte la macro:
:map q gggggggggggggesc
in questo modo fai sostituzioni a catena [3x13=39 sostituzioni].
Per evitare che il timeout fermi la macro quando il tempo di esecuzione
e' > di 1 secondo, disabilitalo con
: set notimeout
Buona fortuna,  sono perfettamente consapevole che sono istruzioni in
ostrogoto, ma non ho di meglio se non scrivere un programmino. Una
tantum, va bene
Ciao :-)