2013-08-26 11 views
5

Chcę zamienić wszystkie tabulatory na jedną zakładkę z sed. Próbuję użyćzastępując zakładki pojedynczą zakładką w sed

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

ale to nie wydają się działać

Jeśli otworzę w sublime regex i zastąpić przez cały \t+ do \t działa prawidłowo

co jest nie tak z moim sed?

Również, jeśli mogę wymienić zaczepy z przecinkiem z

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

uzyskać tego rodzaju linii

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

Pamiętaj '+' oznacza jedną lub więcej osób, dzięki czemu można również napisz '\ t \ t *' – potong

+0

Jeśli '\ t' nie działa, spróbuj użyć [Ctrl] - [v] [Tab] ([zobacz tę odpowiedź] (http://stackoverflow.com/questions/6392249/how-to-enter-a-tab-char-on-command-line)) jeśli pracujesz na terminalu * nix. Kopiowanie-wklejanie znaku tabulatora może działać, ale w moich kartach terminali zostały zastąpione czterema spacjami. –

Odpowiedz

11

Można również użyć tr zastąpić wiele kart z tylko jednego:

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

Opcja -s ściska powtórzenia:

-s, --squeeze-powtórzenia

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

NOte, że 'tr-s '\ t'' wystarcza, by ścisnąć, drugie' \' \ t'' nie jest konieczne. – fedorqui

7

Zastosowanie -r opcja i g flag:

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

-r do sprawiają, że + do pracy.

g Flaga, aby zastąpić wszystkie wystąpienia.

UPDATE

Jeśli Twój sed nie obsługuje -r opcję, wypróbuj następujące zamiast:

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

to nie działa dla mnie ... może to być moje sed jest zepsuty? –

+0

@NickGinanto, jakiego systemu operacyjnego używasz? – falsetru

+0

Próbuję na win7 z powershell. Próbowałem również tego z cygwinem –

0

można też użyć

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