Newsgroup: it.comp.os.linux.iniziare
Titolo: modificare righe di file

Se, ad esempio, dovessi prima cercare e poi modificare un link oppure 
una parola ripetuti in diversi file all'interno di una directory, è 
possibile farlo da shell?
Insomma tutto in un colpo solo, senza dover aprire file per file in un 
editor html.
Anche se non da shell mi basterebbe sapere se c'è un editor che permette 
di farlo.
Manu

 ...
man sed

 possibile farlo da shell?
man grep
man sed
Per esempio:
for f in `ls`; do
   grep 'pincoPallino' "$f"
   sed 's|pippo|pluto|' "$f" > "$f.nuovo"
done
Ciao,
-- 
        Roberto Divia`              Love at first sight is one of the greatest
Dep:PH Bat:53 Mailbox:C02110      labour-saving devices the world has ever seen
Route de Meyrin 385               ---------------------------------------------
Case Postale                                Phone:  
+41-22-767-4994
CH-1211 Geneve 23 CERN                      Fax:    
+41-22-767-9585
Switzerland                                 E-Mail: 
Robert...@cern.ch

 done
Il for non serve
man sed opzione -i

 done
Il for non si fa in quel modo
for fname in *
 do
   echo $fname 
 done

Roberto Divia ha scritto:
grazie 1000 a tutti.
Manu bonNatale(quasi)

  done
...scribble
....scribble
.....scribble.
fatto!
:-)
Manu

mallin.shetland ha scritto:

non c'e' alcun errore sintattico nel post di RD
ciao,
--
oggei

 non c'e' alcun errore sintattico nel post di RD
Infatti l'orrore [sic] non era sintattico.
man bash
/^ *Pathname Expansion


Due metodi diversi. Funzionano entrambi. Il mio usa una linea in meno ;-)



Era per essere generico e per dare una spinta all'uso del bash scripting.
In ogni caso, la richiesta originale comprendeva la ricerca... quindi il
grep e il for.


 Infatti l'orrore [sic] non era sintattico.
In ogni caso, il for potrebbe non funzionare. Crea un file tipo "a b" e poi
vedi che succede ;-)


 linea in meno ;-)
La soluzione con ls non ha nessun vantaggio 
e presenta molti difetti.
Il principale e` che e` impossibile gestire
i nomi dei file contenenti spazi.

 tipo "a b" e poi vedi che succede ;-)
Esistoni le virgolette.
PS Dimenticavo, con ls non funzionano ;)


Ho fatto qualche prova.
"for f in *" funge
"for f in `ls`" non funge
"ls | while read f" funge
Il problema e` che se non si vogliono tutti i files, il "*" non lo si puo`
usare. Quindi. o si va di regexp oppure bisogna fare una lista...


 bisogna fare una lista...
Ma stai scherzando?
for i in *.txt


Esatto, questa e` una regexp. Ora immagina di voler solo una parte
dei *.txt, per esempio quelli che contengono una certa stringa.
Questa non e` piu' una regexp ma una lista...
Una soluzione "generica" funziona in tutti i casi. Una funzione specifica
va fino a quando le condizioni di base vengono rispettate.
Quando posso, preferisco dare soluzioni generiche. Non si sa mai per che
cosa potrebbero essere usate. Se invece scrivo dello script per mio uso
e consumo, allora uso il metodo piu` appropriato.


 certa stringa...
Proponi prima il problema e poi discutiamo della soluzione; 
Questa e` un altro problema e si risolve in un altro modo.

 Se, ad esempio, dovessi prima cercare e poi modificare un link oppure una parola ripetuti in diversi file all'interno di una directory, è possibile farlo da shell? 
Si parla di "diversi file", non di "tutti i files". La tua soluzione funziona
solo se si lavora su tutti i files o su tutti i files di un certo tipo o
tutti i files specificabili con una regexp data. Io volevo essere il piu`
generico possible.
