2009-10-03 7 views
23

Với một kịch bản bash đơn giản tôi tạo ra một tập tin văn bản với nhiều dòng như thế này:Làm cách nào để ghép nối hai dòng của một tệp văn bản với Bash?

192.168.1.1 
hostname1 
192.168.1.2 
hostname2 
192.168.1.3 
hostname3 

Bây giờ tôi muốn định dạng lại tập tin này để nó trông như thế này:

192.168.1.1 hostname1 
192.168.1.2 hostname2 
192.168.1.3 hostname3 

Làm thế nào sẽ tôi định dạng lại theo cách này? Có lẽ sed?

+1

tại sao bạn không tạo cho bạn nộp theo định dạng mong muốn bắt đầu với? – SilentGhost

Trả lời

28
$ sed '$!N;s/\n/ /' infile 
192.168.1.1 hostname1 
192.168.1.2 hostname2 
192.168.1.3 hostname3 
+0

Bạn vui lòng giải thích nó như thế nào? – NawaMan

+0

cảm ơn. chính xác những gì tôi tìm kiếm. :) – fwaechter

+5

@NawaMan: Nếu bạn có nghĩa là "nó hoạt động như thế nào?" sau đó: Nếu không (!) dòng cuối cùng ($) sau đó nối thêm dòng tiếp theo (N) và thay dòng mới giữa chúng bằng dấu cách (s/\ n//) và lặp lại bắt đầu bằng dòng tiếp theo (sẽ là 3, 5, v.v.) –

30

Dưới đây là một vỏ chỉ thay thế:

while read first; do read second; echo "$first $second"; done 
+1

Nhưng bạn nên [luôn luôn] (http://wiki.bash-hackers.org/commands/builtin/read#read_without_-r) sử dụng cờ '' -r'' với '' read''. –

+1

hiện dòng 'done' cần phải được thực hiện

13

Tôi yêu sự đơn giản của giải pháp này

cat infile | paste -sd ' \n' 

192.168.1.1 hostname1 
192.168.1.2 hostname2 
192.168.1.3 hostname3 

hoặc làm cho nó dấu phẩy tách ra thay vì không gian tách

cat infile | paste -sd ',\n' 

và nếu tập tin đầu vào của bạn ha d một dòng thứ ba như timestamp

192.168.1.1 
hostname1 
14423289909 
192.168.1.2 
hostname2 
14423289910 
192.168.1.3 
hostname3 
14423289911 

sau đó thay đổi duy nhất là thêm một không gian khác vào danh sách delimiter

cat infile | paste -sd ' \n' 

192.168.1.1 hostname1 14423289909 
192.168.1.2 hostname2 14423289910 
192.168.1.3 hostname3 14423289911 
+0

Điều này ngắn gọn, dễ hiểu và rất dễ mở rộng. Cảm ơn! – musiphil