Trả lời nhanh
sed ':a;N;$!ba;s/\n/ /g' file
- : a tạo nhãn 'a'
- N nối dòng tiếp theo vào không gian mẫu
- $! nếu không phải là dòng cuối cùng , ba nhánh (đi đến) nhãn 'a'
- s thay thế , / \ n / regex cho dòng mới , / / bởi một khoảng trắng , / g khớp toàn cục (càng nhiều lần càng tốt)
sed sẽ lặp qua bước 1 đến 3 cho đến khi đến dòng cuối cùng, nhận được tất cả các dòng vừa với không gian mẫu trong đó sed sẽ thay thế tất cả các ký tự \ n
Lựa chọn thay thế
Tất cả các lựa chọn thay thế, không giống như sed sẽ không cần phải đến dòng cuối cùng để bắt đầu quá trình
với bash , chậm
while read line; do printf "%s" "$line "; done < file
với perl , sed -like tốc độ
perl -p -e 's/\n/ /' file
với tr , nhanh hơn sed , chỉ có thể thay thế bằng một ký tự
tr '\n' ' ' < file
với dán , tốc độ giống như tr , chỉ có thể thay thế bằng một ký tự
paste -s -d ' ' file
với awk , tốc độ như tr
awk 1 ORS=' ' file
Thay thế khác như "echo $ (<file)" là chậm, chỉ hoạt động trên các tệp nhỏ và cần xử lý toàn bộ tệp để bắt đầu quá trình.
5.10. Tại sao tôi không thể khớp hoặc xóa một dòng mới bằng cách sử dụng
chuỗi thoát \ n ? Tại sao tôi không thể kết hợp 2 dòng trở lên bằng \ n?
\ N sẽ không bao giờ khớp với dòng mới ở cuối dòng vì
dòng mới luôn bị loại bỏ trước khi dòng được đặt vào
không gian mẫu. Để có được 2 hoặc nhiều dòng vào không gian mẫu, hãy sử dụng
lệnh 'N' hoặc một cái gì đó tương tự (chẳng hạn như 'H; ...; g;').
Sed hoạt động như thế này: sed đọc từng dòng một, cắt
bỏ dòng mới kết thúc, đặt những gì còn lại vào không gian mẫu nơi
tập lệnh sed có thể xử lý hoặc thay đổi nó, và khi không gian mẫu
được in, sẽ thêm một dòng mới vào thiết bị xuất chuẩn (hoặc vào một tập tin). Nếu
không gian mẫu bị xóa hoàn toàn hoặc một phần với 'd' hoặc 'D',
dòng mới sẽ không được thêm vào trong các trường hợp như vậy. Do đó, các kịch bản như
sed 's/\n//' file # to delete newlines from each line
sed 's/\n/foo\n/' file # to add a word to the end of each line
sẽ KHÔNG BAO GIỜ hoạt động, bởi vì dòng mới theo dõi được loại bỏ trước khi
dòng được đưa vào không gian mẫu. Để thực hiện các tác vụ trên,
thay vào đó hãy sử dụng một trong các tập lệnh sau:
tr -d '\n' < file # use tr to delete newlines
sed ':a;N;$!ba;s/\n//g' file # GNU sed to delete newlines
sed 's/$/ foo/' file # add "foo" to end of each line
Do các phiên bản của sed khác với GNU sed có giới hạn về kích thước của
bộ đệm mẫu, nên tiện ích 'tr' của Unix được ưu tiên ở đây.
Nếu dòng cuối cùng của tệp chứa một dòng mới, GNU sed sẽ thêm
dòng mới đó vào đầu ra nhưng xóa tất cả các dòng khác, trong khi tr sẽ
xóa tất cả các dòng mới.
Để khớp một khối gồm hai hoặc nhiều dòng, có 3 lựa chọn cơ bản:
(1) sử dụng lệnh 'N' để thêm dòng Tiếp theo vào không gian mẫu;
(2) sử dụng lệnh 'H' ít nhất hai lần để nối dòng hiện tại
vào không gian Giữ, sau đó truy xuất các dòng từ không gian giữ
bằng x, g hoặc G; hoặc (3) sử dụng phạm vi địa chỉ (xem phần 3.3, ở trên)
để khớp các dòng giữa hai địa chỉ được chỉ định.
Các lựa chọn (1) và (2) sẽ đặt \ n vào không gian mẫu, tại đó nó
có thể được xử lý theo ý muốn ('s / ABC \ nXYZ / alph / g'). Một ví dụ
về việc sử dụng 'N' để xóa một khối các dòng xuất hiện trong phần 4.13
("Làm cách nào để xóa một khối các dòng liên tiếp cụ thể ?").
Ví dụ này có thể được sửa đổi bằng cách thay đổi lệnh xóa thành một thứ
khác, như 'p' (in), 'i' (insert), 'c' (thay đổi), 'a' (chắp thêm)
hoặc 's' (thay thế) .
Choice (3) sẽ không chấm \ n vào không gian mô hình, nhưng nó không
phù hợp với một khối dòng liên tiếp, vì vậy nó có thể là bạn không
còn cần \ n để tìm thấy những gì bạn đang tìm kiếm. Do GNU sed
phiên bản 3.02.80 hiện hỗ trợ cú pháp này:
sed '/start/,+4d' # to delete "start" plus the next 4 lines,
ngoài các
địa chỉ phạm vi '/ từ đây /, / đến đó / {...}' truyền thống , có thể tránh hoàn toàn việc sử dụng \ n.
tr
chỉ là công cụ phù hợp cho công việc nếu thay thế một ký tự cho một ký tự, trong khi ví dụ trên hiển thị thay thế dòng mới bằng một khoảng trắng .. Vì vậy, trong ví dụ trên, tr có thể hoạt động .. Nhưng sẽ hạn chế về sau.