Ho spostato le mie classi da uno spazio dei nomi globale in uno spazio dei nomi specifico. Ho anche cambiato i nomi delle classi. Voglio convertire tutti i miei file sorgente che utilizzano queste classi nel nuovo formato. Stavo pensando allo script bash
usando un file sed
su Cygwin o eseguendo uno script perl. Sto avendo problemi con lo script bash
.Script per modificare i nomi delle classi C++
Ecco il processo che sto cercando di realizzare:
- Per ogni file sorgente, * cpp e * .hpp, in modo ricorsivo:
- Se il file contiene un vecchio nome della classe , poi convertire il file.
- Fine per.
Il mio problema nello script Bash
sta rilevando se il file contiene un nome di classe precedente. Stavo pensando di una grep
dichiarazione per ogni nome di classe:
for f in `find . -iname \*.[ch]pp`;
do
if [ grep "Field_Blob_Medium" $f -eq 0 || grep "Field_Boolean" ]; then
sed -f conversion.sed $f
fi
done
Un problema è che solo un comando può essere in Bash
if, utilizzando questa sintassi:
if grep "Field_Unsigned_Short" $f;
quindi non posso fare un OR logico di grep
s.
ho potuto eseguire un ciclo nidificato, ma non so come break
fuori da un ciclo for Bash
:
OLD_CLASS_NAMES="Field_Blob_Medium Field_Boolean Field_Unsigned_Int"
for f in `find . -iname \*.[ch]pp`;
do
for c_name in $OLD_CLASS_NAMES;
do
if grep $c_name $f then
sed -f convert.sed $f # <-- Need to break out of inner loop after this execution.
fi
done
done
Quindi sono alla ricerca di suggerimenti su come elaborare ogni file di origine che contiene vecchi nomi di classe e convertirli in nuovi. È preferibile un esempio di script Cygwin Bash
, sebbene anche uno script Perl sia accettabile. Inoltre, lo script deve eseguire una copia di backup del file di origine originale prima di scrivere i contenuti convertiti nel file new
.
Sono in esecuzione Cygwin su Windows XP e Windows Vista.
non puoi usare solo grep con regexp multipli? grep -e "Field_Blob_Medium" -e "Field_Boolean" -e "Field_Unsigned_Int" ... ? – lollinus
per eseguire il backup di ogni file elaborato: sed -i.bak -f convert.sed $ f – lollinus
'break' interrompe i cicli' for' e si può fare 'if prog || prog || prog' per OR logico (ma l'alternanza delle regex è migliore in questo caso). 'for' con' find' è di solito una cattiva idea perché fallisce quando i nomi dei file hanno spazi. È meglio mettere pipe 'find' in' while'. –