Không cần đặt nhãn :a
bên ngoài hướng dẫn chính, cũng không phải là -e
tùy chọn cần thiết; cuối cùng, /$/
là không cần thiết (mỗi dòng có một ký tự EOL).
Cải thiện các câu trả lời khác, người ta nhận được
sed -i ':a; N; s/\n/ /; ta' file
Cái nào rõ ràng hơn nếu được viết như sau,
sed -i ':a
N
s/\n/ /
ta' file
Lệnh này hoạt động như sau:
N
nối thêm dòng tiếp theo vào không gian mẫu (multiline), đã chứa dòng hiện tại;
s/\n/ /
thay thế ký tự dòng mới \n
được tạo bởi N
một khoảng trắng
;
ta
đi đến dòng tập lệnh theo nhãn :a
miễn là thay thế ở bước 2 thành công , tức là nếu thay thế xảy ra, thực thi sẽ nhảy sang bước 1 mà không "nhấn" phần cuối của tập lệnh, tức là không đọc dòng đầu vào khác.
Lưu ý những điều dưới đây;
sed
đọc từng dòng của tệp đầu vào theo thứ tự, bắt đầu từ dòng thứ 1 ;
:a
chỉ là một nhãn hiệu, không phải là một lệnh được thực thi;
N
về nguyên tắc, được thực hiện trên bất kỳ dòng nào, nhưng
s/\n/ /
(về nguyên tắc được thực hiện trên bất kỳ dòng nào) là thành công trên bất kỳ dòng nào, nhưng dòng cuối cùng , vì vậy
ta
làm cho phần cuối của tập lệnh chỉ có thể truy cập khi dòng đầu vào cuối cùng được đọc (dòng duy nhất s
không thành công), vì vậy
- không có dòng đầu vào nào được đọc vào không gian mẫu sau khi dòng thứ nhất được đọc vào nó, trừ khi dòng cuối cùng được đọc, nhưng sau đó không có dòng nào nữa để đọc và
p
lệnh ẩn được thực thi.
Vì vậy, kịch bản về cơ bản đọc trong dòng đầu vào thứ nhất và tiếp tục nối tiếp từng dòng sau, mỗi lần thay thế dòng mới bằng một khoảng trắng; sau khi dòng cuối cùng được nối (và \n
thay đổi trong một khoảng trắng), N
không thể nối thêm bất kỳ dòng nào, s
không thành công, ta
bị bỏ qua, kết thúc tập lệnh và p
câu lệnh rint ngụ ý được thực thi trên không gian mẫu 1 dòng hiện tại .
Các -i
tùy chọn thay thế các tập tin đầu vào file
với toàn bộ không gian mẫu 1-line.