sed '5,${s/^$//; t delete; b end; : delete; d; : end;}' temp_spec.rb
Chỉnh sửa 1:
Tôi phải giải thích điều này, do đó ...
Điều này là phức tạp không cần thiết. Tôi không biết rằng phạm vi địa chỉ được cho phép trong {}. Vì vậy, tôi đã phải thể hiện "xóa các dòng trống" khác nhau. Lệnh cốt lõi là tcách của sed if ... then. Tsẽ dễ dàng hơn nhưng chỉ có sẵn cho GNU sed. Tôi trích dẫn trang người đàn ông:
nhãn t: Nếu như /// đã thực hiện thay thế thành công kể từ khi dòng đầu vào cuối cùng được đọc và kể từ lệnh t hoặc T cuối cùng, sau đó phân nhánh thành nhãn; nếu nhãn bị bỏ qua, nhánh đến cuối tập lệnh.
Tôi lạm dụng smệnh lệnh nổi tiếng . Nó sẽ không thay thế bất cứ điều gì mà chỉ kiểm tra xem dòng có trống không. Vì vậy, nó thay thế một dòng trống bằng một dòng trống (có thể sử dụng bất cứ thứ gì thay thế khi dòng bị xóa bằng mọi cách).
Nếu sđã thực hiện "thay thế" thì dòng trống. Trong trường hợp đó, lệnh dsẽ được thực thi. Nếu không thì không có gì để làm Vì tkhông nhảy trong trường hợp có shành động, tôi cần lệnh nhánh bđể nhảy đến cuối tập lệnh. : labellà mục tiêu chi nhánh. Giống như gotohồi đó trong thời kỳ đen tối (khi sed được phát minh ... te-hee).
Một tùy chọn khác là s"thay thế" tất cả các dòng không trống, làm cho lệnh sphức tạp hơn nhưng phần còn lại dễ dàng hơn:
sed '5,${s/^\(..*\)$/\1/; t end; d; : end;}' input
^..*$có nghĩa là "dòng không trống" và \1có nghĩa là "nội dung của dấu ngoặc đầu tiên".