PDA

Visualizza la versione completa : Trova e sostituisci ricorsivo


james
23-02-2005, 12:32
Ho trovato questo script bash nel forum

#!/bin/bash
for file in `ls *.txt`; do
cat $file | sed -e 's/prima/dopo/g' > $file
done

Però praticamente mi cancella tutto il contenuto dei file anzike fare un trova e sostituisci, perchè?

stabi
23-02-2005, 12:36
code:--------------------------------------------------------------------------------#
!/bin/bash
for file in `ls *.txt`; do
cat $file | sed -e 's/prima/dopo/g' > $file
done
--------------------------------------------------------------------------------
prova con

!/bin/bash
for file in `ls *.txt`; do
cat $file | sed -e 's/prima/dopo/g' > tmp$file
mv tmp$file $file
done

james
23-02-2005, 12:56
Originariamente inviato da stabi
code:--------------------------------------------------------------------------------#
!/bin/bash
for file in `ls *.txt`; do
cat $file | sed -e 's/prima/dopo/g' > $file
done
--------------------------------------------------------------------------------
prova con

!/bin/bash
for file in `ls *.txt`; do
cat $file | sed -e 's/prima/dopo/g' > tmp$file
mv tmp$file $file
done

non mi svuota più i file ma non funziona la sostituzione, però i files vengono ricreati perchè l'ora di modifica cambia, quindi il mv funziona, dove sbaglio?

Ilmalcom
23-02-2005, 16:00
Originariamente inviato da james
Ho trovato questo script bash nel forum

#!/bin/bash
for file in `ls *.txt`; do
cat $file | sed -e 's/prima/dopo/g' > $file
done

Però praticamente mi cancella tutto il contenuto dei file anzike fare un trova e sostituisci, perchè?
Prova a farlo così


#!/bin/bash
for file in `ls *.txt`; do
cat "$file" | sed -e 's/prima/dopo/g' > file_temp
mv file_temp "$file"
done

james
23-02-2005, 17:49
Originariamente inviato da Ilmalcom
Prova a farlo così


#!/bin/bash
for file in `ls *.txt`; do
cat "$file" | sed -e 's/prima/dopo/g' > file_temp
mv file_temp "$file"
done



mille grazie!

cacao74
23-02-2005, 18:48
giusto per completezza:


cat "$file" | sed -e "s/prima/dopo/g;w $file"

oppure semplicemente:

*** sed -e "s/prima/dopo/g;w $file" $file ***
*** non usare, perchè 'svuota' il file ***

Per sicurezza provarlo prima su una directory di test.

man 1 sed.

ciao

[EDIT]
Ho sostituito gli apici singoli (') con quelli doppi (") per permettere l'espansione della variabile.
:rollo:

scusate per i grossolani errori.

mykol
24-02-2005, 00:58
scusate, sono proprio niubbo in queste cose ... mi spiegate il funzionamento per favore ? cosa gli devo passare come input ?

ad es. ho il file pippo.tx, in cui devo sostituire Filippo con Antonio. Come devo lanciarlo ?

grazie

Mutato
24-02-2005, 01:02
Originariamente inviato da mykol
scusate, sono proprio niubbo in queste cose ... mi spiegate il funzionamento per favore ? cosa gli devo passare come input ?

ad es. ho il file pippo.tx, in cui devo sostituire Filippo con Antonio. Come devo lanciarlo ?

grazie




cat pippo.txt | sed -e 's/Filippo/Antonio/g' > file_temp
mv file_temp pippo.txt

Loading