2013-08-26 66 views
5

Tôi muốn thay thế tất cả các tab bằng một tab có chứa sed. Tôi cố gắng để sử dụngthay thế các tab bằng một tab duy nhất trong sed

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

nhưng điều này dường như không làm việc

Nếu tôi mở siêu việt và thay thế bằng regex tất cả \t+ để \t nó hoạt động đúng

gì là sai với tôi sed?

Ngoài ra, nếu tôi thay thế các tab với một dấu phẩy với

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

tôi nhận được loại này của dòng

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

Ghi '+ 'có nghĩa là một hoặc nhiều hơn như vậy cũng có thể được viết '\ t \ t *' – potong

+0

Nếu '\ t' không hoạt động, hãy thử sử dụng [Ctrl] - [v] [Tab] ([xem câu trả lời này] (http://stackoverflow.com/questions/6392249/how-to-enter-a-tab-char-on-command-line)) nếu làm việc trong một thiết bị đầu cuối * nix. Việc sao chép một ký tự tab có thể hoạt động, nhưng trong các tab đầu cuối của tôi đã được thay thế bằng bốn dấu cách. –

Trả lời

11

Bạn cũng có thể sử dụng tr để thay thế nhiều tab với một duy nhất:

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

Tùy chọn -s sẽ lặp lại:

-s, --squeeze-lặp

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

NOte rằng 'tr -s '\ t'' là đủ để ép, thứ hai'' \ t'' là không cần thiết. – fedorqui

7

Sử dụng -r tùy chọn và g cờ:

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

-r để làm cho + hoạt động.

g gắn cờ để thay thế tất cả các lần xuất hiện.

CẬP NHẬT

Nếu bạn sed không hỗ trợ -r tùy chọn, hãy thử sau thay vì:

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

điều này không hiệu quả đối với tôi ... nó có thể là sed của tôi bị hỏng không? –

+0

@NickGinanto, Bạn sử dụng hệ điều hành nào? – falsetru

+0

Tôi đang thử trên win7 với powershell. Cũng đã thử điều này với cygwin –

0

bạn cũng có thể sử dụng

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