PDA

View Full Version : [unxutils] sintassi sed


john_revelator
05-06-2009, 15:14
Salve a tutti. Ho bisogno di modificare via batch delle righe di un file di testo. Ho cercato un pò in rete e a quanto ho capito serve il porting su windows del comando sed di linux.

Ho perciò scaricato da qui

http://sourceforge.net/projects/unxutils

il pacchetto e copiato il file sed.exe nella cartella system32.

Purtroppo l'help del comando non mi è stato di grosso aiuto.

Ciò che vorrei fare è semplicemente, una volta richiamato il comando, potergli dare come parametri il nome del file, la stringa da cercare e quella con cui sostituirla. Spero che qualcuno di voi abbia giù usato questa utility e possa consigliarmi. :)

P.S. Non sapevo se postare qui o in programmazione. Nel caso la sezione sia sbagliata mi scuso fin da ora e chiedo a un moderatore che gentilmente mi sposti.

john_revelator
05-06-2009, 15:40
Cercando un pò ho trovato un prezioso suggerimento su wikipedia

http://en.wikipedia.org/wiki/Sed

che adattata a windows son riuscito a far funzionare così

sed "s/stringa_da_cercare/stinga_da_sostituire/g" file_input.txt > file_output.txt

Ultima domanda: è possibile effettuare sostituzioni multiple in un colpo solo o sono costretto a eseguire prima un comando, poi passare come input della seconda sostituzione l'ouput della prima e così via? Grazie.

john_revelator
05-06-2009, 16:18
Mi rispondo da solo. E' possibile separando le sostituzioni con il punto e virgola

sed "s/cerca1/sostituisci1/g;s/cerca2/sostituisci2/g" input.txt > output.txt

zuper
05-06-2009, 19:40
sorry nn ho fatto in tempo ad aiutarti :)

la tua soluzione va bene...
ma secondo me è meglio se usi uno "script" file per le sostituzioni :)

sed -f SCRIPTFILE input > output

e nello SCRIPT FILE ci metti le tue sostituzioni:

s/cerca1/sostituisci1/g
s/cerca2/sostituisci2/g

(credo vada anche nella versione per windows...ma nn sono sicuro...se vuoi prova)

john_revelator
05-06-2009, 20:19
Ciao zuper. Gentilissimo. ;)

Ho provato e funziona perfettamente. In questo modo risulta tutto più pulito. Ho anche provato a fare una sostituzione non case-sensitive e ho visto su google che è sufficiente aggiungere il parametro i.

s/cerca1/sostituisci1/gi
s/cerca2/sostituisci2/gi

Mi rimane ancora una curiosità se puoi aiutarmi. E' possibile effettuare una sostituzione soltanto nel caso in cui una riga del file contenga SOLO il testo specificato come cerca e non anche altro contenuto?

Esempio

pippo
ciao pippo
pippo

Vorrei sostituire pippo con pluto solo nelle righe 1 e 3.

Grazie ancora. :)

zuper
05-06-2009, 20:40
dopo controllo
al volo prova

s/^pippo//d

john_revelator
06-06-2009, 00:32
Grazie per la risposta ma non ho capito come va scritta per intero. :fagiano:

zuper
06-06-2009, 00:35
Grazie per la risposta ma non ho capito come va scritta per intero. :fagiano:

come prima...credo :) non ho mai provato quel tipo di sostituzione :)

sed "s/^pippo/stringainsostituzione/d" input > output

john_revelator
06-06-2009, 00:45
Grazie. Purtroppo mi restituisce un file vuoto. Ho anche provato con

sed "s/^pippo$/pluto/g" input > output

ma modifica solo l'ultima riga del file.

zuper
06-06-2009, 00:57
Grazie. Purtroppo mi restituisce un file vuoto. Ho anche provato con

sed "s/^pippo$/pluto/g" input > output

ma modifica solo l'ultima riga del file.

sorry!

domani ci do un occhio, ritiro su una macchina linux e ti dico...spero ;)

zuper
06-06-2009, 01:23
boh io sto provando su una macchina linux e il

sed 's/^pippo$/pluto/g' test

funziona...

john_revelator
06-06-2009, 01:27
Evidentemente questo porting su windows è stato fatto ad cazzum. Mi è stato consigliato di provare gnuwin32. Domani tenterò con quello. Grazie per la disponibilità e buona notte. :)

zuper
06-06-2009, 01:33
Evidentemente questo porting su windows è stato fatto ad cazzum. Mi è stato consigliato di provare gnuwin32. Domani tenterò con quello. Grazie per la disponibilità e buona notte. :)

notte :)

se no ti scarichi una fedora vmware e la usi con vmware player :D

zuper
06-06-2009, 01:38
vedi?
[root@localhost tmp]# cat test
pippo
ciao pippo
pippo
pippo cane
[root@localhost tmp]# sed 's/^pippo$/pluto/g' test
pluto
ciao pippo
pluto
pippo cane
[root@localhost tmp]#

john_revelator
06-06-2009, 11:45
Ho visto. E' proprio un problema del porting. Ripiegherò su gnuwin32 allora sperando vada meglio. Grazie ancora.

edit.
Confermo che ^pippo$ col sed di gnuwin32 fa esattamente il suo dovere. :)

zuper
06-06-2009, 12:52
Confermo che ^pippo$ col sed di gnuwin32 fa esattamente il suo dovere. :)

quasi quasi ci do un occhio è sempre comodo avere tools di linux sotto windows :)