2009-05-28 31 views
27

Tôi có một tập tin có chứa:Làm cách nào để thay thế nhiều dòng trống bằng một dòng trống trong bash?

something 



something else 

something else again 

Tôi cần một lệnh bash, sed/grep chúng tôi sẽ cho kết quả sau

something 

something else 

something else again 

Nói cách khác, tôi cần phải thay thế nhiều dòng trống chỉ với một dòng trống. grep/sed dựa trên dòng. Tôi chưa bao giờ tìm thấy giải pháp BASH có thể hoạt động trên các mẫu regex nhiều dòng.

+0

nhanh làm rõ câu hỏi: Tệp có bao giờ có các dòng * không * được phân tách bằng một dòng trống không? – biggusjimmus

+3

Bạn có bao giờ có dòng trùng lặp không được để trống không? Nếu không, bạn có thể sử dụng uniq. –

+0

Có những dòng không được phân tách bằng một dòng trống. Có thể có các dòng trùng lặp. –

Trả lời

65

Đối với hệ thống BSD có nguồn gốc từ (bao gồm GNU):

Bạn chỉ cần cat với các tùy chọn -s mà làm cho nó để loại bỏ lặp đi lặp lại có sản phẩm nào dòng từ đầu ra của nó:

cat -s 

từ trang người đàn ông: -s --squeeze-blank: suppress repeated empty output lines.

+0

Duh. Giải pháp hoàn hảo. –

+3

vì bất kỳ lý do gì mà doesnt làm việc cho tôi 'cat -s file1> file2' – qodeninja

+4

@qodeninja Nó không làm việc cho tôi hoặc khi tôi đã làm việc với các tập tin với kết thúc dòng Windows. Có lẽ đó có thể là vấn đề cho bạn? Khi tôi chuyển đổi các tập tin để kết thúc dòng Unix 'cat -s' làm việc tốt cho tôi. –

1

Sử dụng python:

s = file("filename.txt").read() 
while "\n\n\n" in s: s = s.replace("\n\n\n", "\n\n") 
import sys 
sys.stdout.write(s) 
+0

điều này là không hiệu quả trong khi vòng lặp – user5672998

-1

siêu dễ dàng để làm với vim. Chỉ cần mở tệp và nhập như sau:

:%s/\n\n\n*/\r\r/ 

Điều đó sẽ giảm tất cả các khối của hơn 2 dòng mới thành 2 dòng mới. Hi vọng điêu nay co ich!

6

Trên thực tế, nếu bạn thay thế nhiều dòng mới với một dòng mới duy nhất, đầu ra sẽ là:

something 
something else 
something else again 

Bạn có thể đạt được điều này bằng cách:

sed /^$/d FILE 
+0

Điều này là đúng, rõ ràng :) OP có nghĩa là gì để thay thế nhiều "trống" (lưu ý rằng điều này không nhất thiết phải rỗng, vì dòng có thể có không gian trắng vô hình) với một dòng trống (trừ khi nó ở đầu hoặc cuối của chuỗi) có nghĩa là hai ký tự dòng mới. – arielf

-2

Tôi mang nó mà có thể bạn sẽ muốn để xóa các đường chỉ có khoảng trắng.

Điều đó có thể được thực hiện với:

sed /^[:space:]*$/d FILE 
2

Một giải pháp với awk, thay thế một vài dòng trống với một dòng trống duy nhất:

awk 'BEGIN{bl=0}/^$/{bl++;if(bl==1)print;else next}/^..*$/{bl=0;print}' myfile 
+0

+1: Tâm trí tuyệt vời nghĩ như nhau: P –

2

Thông thường, nếu tôi thấy rằng không thể sed làm điều gì đó tôi cần, tôi chuyển sang awk:

awk ' 
BEGIN { 
    blank = 0; 
} 

/^[[:blank:]]*$/ { 
    if (!blank) { 
      print; 
    } 
    blank = 1; 
    next; 
} 

{ 
    print; 
    blank = 0; 
}' file 
+0

Giải pháp của bạn dễ đọc hơn! – mouviciel

12
grep -A1 . <yourfile> | grep -v "^--$" 

giải pháp grep này hoạt động giả sử bạn muốn những điều sau:

Input

line1 

line2 
line3 


line4 



line5

Output

line1 

line2 
line3 

line4 

line5
+0

Hoàn hảo. Cảm ơn bạn! –

+0

Tôi thích nó, giải pháp rất thanh lịch – duckyflip

+3

Frickin 'rực rỡ, thực sự. Tôi sẽ không nghĩ ra điều này trong một triệu năm nữa. Công việc tốt đẹp. Một _slightly_ phiên bản mạnh mẽ hơn đi như thế này tất nhiên (để xử lý các dòng trống rỗng): grep -v -A1 '^ [[: blank:]] * $' | grep -v '^ - $' –

-4

pipelining nó để | uniq có thể giải pháp (nếu khác so với dòng sản phẩm nào không trùng lặp)

1

Nếu ai đó muốn sử dụng perl

perl -00pe0 < file 

sẽ làm như vậy, như cat -s :)

2

này sử dụng marco's solution trên nhiều tập tin:

for i in *; do FILE=$(cat -s "$i"); echo "$FILE" > "$i"; done 
9

Tôi chỉ giải quyết vấn đề này bằng sed. Thậm chí nếu điều này là một câu hỏi 7 tuổi, một người nào đó có thể có thể vào đây để giúp đỡ, vì vậy tôi đang viết giải pháp của tôi bằng cách sed đây:

sed 'N;/^\n$/D;P;D;' 
+1

Điều này làm việc tốt cho tôi, và bởi vì nó là sed, tôi có thể sử dụng -i để sửa chữa tại chỗ. – Kieran

+0

Wierdly điều này cũng loại bỏ 2 dòng cuối cùng cho tệp cho tôi (trên OSX sed) – Nivco

0

Python, với biểu thức chính quy:

import re 
import sys 
sys.stdout.write(re.sub('\n{2,}','\n\n', sys.stdin.read())) 
Các vấn đề liên quan