2013-08-26 9 views
5

Desidero sostituire tutte le schede multiple con una singola scheda con sed. Sto cercando di utilizzaresostituzione di schede con scheda singola in sed

sed 's:\t+:\t:' .\text.CSV > newtext.csv 

ma questo non sembra funzionare

Se apro nel sublime e sostituirlo con regex tutto \t+ per \t funziona correttamente

ciò che è sbagliato con il mio sed?

Inoltre, se sostituisco le schede con una virgola con

sed 's:\t\t*:,:g' text.CSV > newtext.csv 

ricevo questo tipo di linea

264262360,20030826,200308,2003,2003.6466,BUS,EMPLOYER,,,,,,BUS,,, ,,,,,,,,,,0,051,051,05,1,3.4,12,2,12,5.24866163479182,1 
+1

Ricordati di '+', una o più possono anche essere scritto '\ t \ t *' – potong

+0

Se '\ t' non funziona, prova a usare [Ctrl] - [v] [Tab] ([vedi questa risposta] (http://stackoverflow.com/questions/6392249/how-to-enter-a-tab-char-on-command-line)) se si lavora in un terminale a * nix. Copia-incollare un carattere di tabulazione potrebbe funzionare, ma nelle mie schede terminali sono stati sostituiti da quattro spazi. –

risposta

11

È inoltre possibile utilizzare tr per sostituire più schede con una sola:

tr -s '\t' '\t' <inputfile> outfile 

L'opzione -s ripete le ripetizioni:

-s, --squeeze-repeats

 replace each input sequence of a repeated character that is 
     listed in SET1 with a single occurrence of that character 
+2

NOte che 'tr -s '\ t'' è sufficiente per spremere, il secondo'' \ t'' non è necessario. – fedorqui

7

Usa -r opzione e g bandiera:

sed -r 's:\t+:\t:g' text.CSV > newtext.csv 

-r a rendere operativo +.

g flag per sostituire tutte le occorrenze.

UPDATE

Se il sed non supporta -r opzione, prova a seguire invece:

sed 's:\t\t*:\t:g' text.CSV > newtext.csv 
+0

questo non funziona per me ... potrebbe essere il mio sed è rotto? –

+0

@NickGinanto, quale sistema operativo utilizzi? – falsetru

+0

Sto provando su win7 con PowerShell. Ho provato anche questo con cygwin –

0

si potrebbe anche usare

sed "s/\t\+/\t\g" test.csv >> newtest.csv

Problemi correlati