2012-04-03 35 views
13

Tôi có một tệp thỉnh thoảng có các đường phân tách. Sự phân chia được báo hiệu bởi thực tế là dòng bắt đầu bằng '+' (có thể được đặt trước bởi dấu cách).sed: nối các dòng phụ thuộc vào dòng thứ hai

line 1 
line 2 
    + continue 2 
line 3 
... 

Tôi muốn gia nhập dòng chia lại:

line 1 
line 2 continue 2 
line 3 
... 

sử dụng sed. Tôi không rõ cách tham gia một dòng với số trước là.

Bất kỳ đề xuất nào?

Trả lời

15

Điều này có thể làm việc cho bạn:

sed '$!N;s/\n\s*+//;P;D' file 
+1

Tốt, điều này thậm chí còn hoạt động ở định dạng không phải GNU nếu bạn thay thế '\ s' bằng một khoảng trắng! +1. – ghoti

+0

@ghoti Tôi tin rằng '[[: blank:]] *' có thể hoạt động tốt hơn? –

+1

@AquariusPower, vâng, sẽ khớp với khoảng trắng, nhưng nó cũng sẽ khớp với các tab, tất nhiên là giải pháp của potong về '\ s'. OP đã tuyên bố rằng một sự tiếp tục được biểu thị bằng dấu * '+' có thể trước dấu cách *, nhưng anh ta không nói gì về các tab. Có lẽ không quan trọng, nhưng bạn không bao giờ biết. – ghoti

2

Tôi không phải là một phần của sed nên đây là một thử thách tuyệt vời đối với tôi.

sed -n '1{h;n};/^ *+ */{s// /;H;n};{x;s/\n//g;p};${x;p}' 

Trong awk này là xấp xỉ:

awk ' 
    NR == 1 {hold = $0; next} 
    /^ *\+/ {$1 = ""; hold=hold $0; next} 
    {print hold; hold = $0} 
    END {if (hold) print hold} 
' 

Nếu dòng cuối cùng là một "+" dòng, phiên bản sed sẽ in một dòng trống trailing. Không thể tìm ra cách để ngăn chặn nó.

+0

Lưu ý rằng đây là GNU-sed-only. Phiên bản awk là cách dễ đọc hơn tất nhiên, nhưng nó cũng bị bởi vì khi bạn '$ 1 =" ";', bạn nói awk để viết lại $ 0 với OFS mặc định của nó. Điều đó có thể không quan trọng, nhưng nó nên được ghi nhớ trong trường hợp ai đó muốn sử dụng giải pháp này. – ghoti

1

Làm điều này trong sed chắc chắn là một bài tập tốt, nhưng nó khá tầm thường trong perl:

perl -0777 -pe 's/\n\s*\+//g' input 
2

Bạn có thể sử dụng Vim trong chế độ Ex:

ex -sc g/+/-j -cx file 
  1. g tìm kiếm toàn cầu

  2. - chọn dòng trước

  3. j tham gia với dòng tiếp theo

  4. x lưu và đóng

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