Newsgroup: it.comp.os.linux.sys
Titolo: Script in bash e conversione del fine riga

Hola!
sto cercando di convertire una serie di files di testo dal CSV che
produce Windows Server 2008 per importare i dati dentro ad un MySQL ma
mi sono impantanato sul fine riga.
Nello script ho questo comando:
perl -pi.0 -e 's/\cM//g' *.csv
e funziona: il file generato viene passato ad un sed che aggiunge
regolarmente a fine riga i caratteri richiesti.
Visto che il resto delle operazioni e' fatto a botte di sed, volevo
unire tutto in un unico mega sed ma non sono riuscito a riprodurre lo
stesso comportamento dell'interprete perl con sed
#sed -i.0 -e 's/^M$//' *.csv
funziona ma poi qualsiasi cosa aggiungo in coda con 
sed -i.5 -e 's/$/");/' *.csv
me lo ritrovo su una nuova riga da solo mentre lo vorrei alla fine della
riga. Sono le 11 e sono un po' rinco quindi: aiuto! Cosa sbaglio?
Grazie!
Jey
-- 
Non prendere la vita troppo sul serio... non ne uscirai mai vivo
http://www.joram.it/servizi/consulente.htm

 Sono le 11 e sono un po' rinco quindi: aiuto!
sorry ma sono le 11 pure per me e i neuroni si muovono in ordine sparso.
-- 
Wikipedia Admin: "wikipedia non è un blog"
Iosif Stalin: "i compagni hanno scambiato il partito per un circolo di
discussione"

 hai provato a lanciare prima: unset IFS ?
Non ci avevo pensato perche' cerco di non mettere le mani nei separatori
se non e' proprio necessario cmq ho provato e purtroppo sed mi tradisce
anche se riport IFS al valore di default immediatamente prima di
eseguire sed -i.0 -e 's/^M$//' *.csv
Grazie comunque per l'aiuto.


 riga.
untested
sed 's/.*/&altraroba/'
-- 
Hai capito benissimo quello che intendevi.            -- AirCraft, in ISC

 dos2unix risolve.
or
sed -i 's/\r$//' nome.cvs
;o)
Corrado Roberto
Fingerprint: 8FC8 05DE 2B53 A8AF 8B2B 6CBF AD23 C4D5 86FE 80BB 

...
Andiamo col debug.
Prima di tutto con od o hexdump verifica che effetti_
vamente sed effettui la conversione dei fine riga.
Poi  fai attenzione  alle ancore  `^' e `$'; non sono 
portabili. Per alcune versioni di sed non sono ancore
mentre per altre versioni (e per grep) lo sono. POSIX
permette entrambi i comportamenti ed il sed della GNU 
si comporta molto male in questo caso.  Una soluzione 
è usare il modificatore `M' (sta per "multiline').
sed -i.5 -e 's/$/");/M' *.csv
PS Sai che sed accetta più di un comando? Es.:
sed -i~ '
  s/^M$// 
  s/$/");/M
  /^#include/ d
' *.cvs
Perché usi questo schema per i suffissi di backup?  
Non è meglio usare il suffisso standard `~'?
Cosa è quel cancelletto davanti al primo sed?  Sei
connesso come root  solo per fare  una conversione 
di formato?

 sed -i 's/\r$//' nome.cvs
http://sed.sourceforge.net/sed1line.txt
...
 # IN UNIX ENVIRONMENT: convert DOS newlines (CR/LF) to Unix format.
 sed 's/.$//'               # assumes that all lines end with CR/LF
 sed 's/^M$//'              # in bash/tcsh, press Ctrl-V then Ctrl-M
 sed 's/\x0D$//'            # works on ssed, gsed 3.02.80 or higher
 # IN UNIX ENVIRONMENT: convert Unix newlines (LF) to DOS format.
 sed "s/$/`echo -e \\\r`/"            # command line under ksh
 sed 's/$'"/`echo \\\r`/"             # command line under bash
 sed "s/$/`echo \\\r`/"               # command line under zsh
 sed 's/$/\r/'                        # gsed 3.02.80 or higher
 # IN DOS ENVIRONMENT: convert Unix newlines (LF) to DOS format.
 sed "s/$//"                          # method 1
 sed -n p                             # method 2
 # IN DOS ENVIRONMENT: convert DOS newlines (CR/LF) to Unix format.
 # Can only be done with UnxUtils sed, version 4.0.7 or higher. The
 # UnxUtils version can be identified by the custom "--text" switch
 # which appears when you use the "--help" switch. Otherwise, changing
 # DOS newlines to Unix newlines cannot be done with sed in a DOS
 # environment. Use "tr" instead.
 sed "s/\r//" infile >outfile         # UnxUtils sed v4.0.7 or higher
 tr -d \r <infile >outfile            # GNU tr version 1.22 or higher
...

 
http://sed.sourceforge.net/sed1line.txt
thank you! 

 dos2unix risolve.
Grazie ma purtroppo non posso installarlo sul server in questione.


 di formato?
e' l'indicazione di commento, mi e' scappato di toglierlo.
Grazie


 sed -i 's/\r$//' nome.cvs
Questo purtroppo da lo stesso problema ma grazie.


  sed 's/\x0D$//'            # works on ssed, gsed 3.02.80 or higher
sed -i.0 -e 's/.$//' *.csv
risolve alla grande: grazie!
Un'ultima domanda: secondo te posso svolgere
sed -e 's/$/%/g' $i.csv | tr "%" "\n"
tutto con sed?


 tr "%" "\n" tutto con sed?
Cosa vorresti fare? Cià che hai scritto raddoppia la spaziatura ed è 
equivalente ad inserire degli a capo dopo la fine della riga:
sed '/$/ i
' file.input.txt > file.output.txt
Viceversa se chiedi come eliminare il tr, semplicemente 
leggi il manuale:
sed 's/$/%/;y/%/\n' file.input.txt > file.output.txt