2009-12-06 31 views
5

Làm thế nào để bạn có nói như sau trong regex:Chuyển đổi không gian để các tab trong RegEx

foreach line 
    look at the beginning of the string and convert every group of 3 spaces to a tab 
    Stop once a character other than a space is found 

Đây là những gì tôi có cho đến nay:

/^ +/\t/g 

Tuy nhiên, điều này chuyển đổi mọi không gian để 1 tab

Mọi trợ giúp sẽ được đánh giá cao.

+1

Vui lòng đăng mã bạn đã viết cho đến thời điểm này. Mọi người thường không thích viết mã cho bạn. –

Trả lời

7

Với Perl:

perl -pe '1 while s/\G {3}/\t/gc' input.txt >output.txt 

Ví dụ, với các đầu vào sau

nada 
    three spaces 
    four spaces 
    three in the middle 
     six space 

đầu ra (TAB thay thế bằng \t) là

$ perl -pe '1 while s/\G {3}/\t/gc' input | perl -pe 's/\t/\\t/g' 
nada 
\tthree spaces 
\t four spaces 
\tthree in the middle 
\t\tsix spaces 
+1

Greg, cảm ơn câu trả lời tuyệt vời! Nó có vẻ là không cần thiết phức tạp, tuy nhiên. Cả '1 while' và' // c' có vẻ thừa. Chỉ cần chắc chắn, tôi đã thử chạy đầu vào mẫu của bạn với tất cả các hoán vị giữ/bỏ qua hai mục thừa đó và có kết quả giống hệt nhau. Vì vậy, người ta có thể đơn giản hóa mã bằng cách chỉ có 'perl -pe 's/\ G {3}/\ t/g'' –

-1

Bạn có thể muốn /^(?: {3})*/\t/g

chỉnh sửa: cố định

+0

Điều này chuyển đổi 3 dấu cách thành 1 tab - nhưng cũng chỉ có 6 hoặc 9 hoặc 12 vv. 1 tab. –

+0

không cố định. Hãy thử chạy nó trên dữ liệu mẫu của Greg Bacon. "nada" và "sáu dấu cách" đều bị hỏng. Và nó thiếu 's' hàng đầu. –

3

Tôi biết đây là một câu hỏi cũ nhưng tôi nghĩ rằng tôi muốn cung cấp cho một câu trả lời đầy đủ regex hoạt động (nó cũng làm việc cho tôi).

s/\t* {3}/\t/g 

Tôi thường sử dụng để chuyển đổi một tài liệu toàn bộ trong vim làm điều này trong vim nó trông như thế này:

:%s/\t* \{3\}/\t/g 

Hy vọng nó vẫn giúp một ai đó.

+1

Chuyển đổi không gian ở giữa dòng, vi phạm "Dừng khi một ký tự khác với không gian được tìm thấy" –

Các vấn đề liên quan