2013-03-22 19 views
50

Nếu tôi chạy lệnh cat file | grep pattern, tôi nhận được nhiều dòng đầu ra. Làm thế nào để bạn nối tất cả các dòng vào một dòng, thay thế hiệu quả mỗi "\n" bằng "\" " (kết thúc bằng " theo sau là dấu cách)?Làm thế nào để nối nhiều dòng đầu ra với một dòng?

cat file | grep pattern | xargs sed s/\n/ /g không hoạt động đối với tôi.

+0

thể trùng lặp của [SED: Làm thế nào tôi có thể thay thế một (\ n) xuống dòng] (http://stackoverflow.com/questions/1251999/sed-how-can-i-replace-a- newline-n) – ruakh

+0

Nhân tiện: (1) bạn cần phải đặt kịch bản 'sed' của bạn trong dấu nháy đơn để Bash không gây rối với nó (vì' sed s/\ n// g' gọi là 'sed' với hai đối số, cụ thể là 's/n /' và '/ g'); (2) vì bạn muốn đầu ra của tập tin 'cat | grep pattern' là đầu vào * thành 'sed', không phải là * đối số * thành' sed', bạn cần loại bỏ 'xargs'; và (3) không cần 'cat' ở đây, vì' grep' có thể lấy tên tập tin làm đối số thứ hai của nó. Vì vậy, bạn nên thử 'grep pattern file | sed 's/\ n// g''. (Trong trường hợp này nó sẽ không có tác dụng, vì những lý do được đưa ra ở liên kết trên, nhưng bây giờ bạn biết cho tương lai.) – ruakh

+0

tương tự như "http://stackoverflow.com/questions/2764051/how-to-join- nhiều dòng-of-file-tên-thành-một-với-tùy-delimiter " –

Trả lời

93

Sử dụng tr '\n' ' ' để dịch tất cả các ký tự xuống dòng để không gian:

$ grep pattern file | tr '\n' ' ' 

Lưu ý: grep đọc file, cat concatenates tập tin. Đừng cat file | grep!

Edit:

tr chỉ có thể xử lý dịch ký tự đơn. Bạn có thể sử dụng awk để thay đổi dấu phân cách kỷ lục sản lượng như:

$ grep pattern file | awk '{print}' ORS='" ' 

Điều này sẽ thay đổi:

one 
two 
three 

tới:

one" two" three" 
+2

Bạn kết thúc với một không gian không mong muốn ở cuối với cách tiếp cận này. – sorin

+0

Bạn cần thêm 'echo" "' vào cuối để thêm dòng mới trước văn bản nhắc. – nexayq

+1

Điều này hoạt động độc đáo, tuy nhiên tôi không muốn dấu phân cách hiển thị trên mục nhập cuối cùng. Ví dụ, theo '" 'của bạn, nó xuất hiện giống như' một "hai" ba "', tuy nhiên tôi muốn nó hiển thị như "một" hai "ba". Lưu ý ba số cuối không có dấu ngoặc đơn. Bất kỳ ý tưởng? – oink

14

Đây có thể là những gì bạn muốn

cat file | grep pattern | paste -sd' ' 

As để chỉnh sửa của bạn, tôi không chắc chắn nó có nghĩa là gì, có lẽ điều này?

cat file | grep pattern | paste -sd'~' | sed -e 's/~/" "/g' 

(này giả định rằng ~ không xảy ra trong file)

+0

'grep' có thể đọc chính tệp. – Stephan

+2

@Stephan không cần phải giả định rằng 'tệp cat' sẽ thực sự là' cat', hoặc thậm chí là một tệp. (Tôi chỉ để lại phần đó không thay đổi vì nó không liên quan đến câu hỏi) – sehe

29

sản lượng đường ống để xargs sẽ tiếp nhau mỗi dòng đầu ra vào một dòng duy nhất với không gian:

grep pattern file | xargs 

Hoặc bất kỳ lệnh, ví dụ. ls | xargs. Giới hạn mặc định của đầu ra xargs là ~ 4096 ký tự, nhưng có thể tăng lên bằng ví dụ. xargs -s 8192.

+0

'| tr '\ n' '' 'không hoạt động đối với tôi khi được gọi thông qua hàm' php exec'. Nó đã bỏ qua tr, và chỉ cho trận đấu cuối cùng từ grep. '| xargs' đã hoạt động. – Adarsha

+1

Giải pháp này cũng có lợi thế là nó 'ăn' không gian từ đầu vào. +1 – Rene

+0

Đây phải là câu trả lời được chấp nhận. –

21

Trong bash tiếng vang mà không có dấu ngoặc kép loại bỏ kí tự xuống dòng, tab và nhiều không gian

echo $(cat file) 
+1

Câu trả lời bị đánh giá nghiêm trọng ở đây, điều này thực sự đơn giản và hoạt động như một nét duyên dáng, với một đường nét mới. – Dangercrow

+0

Điều này đặc biệt gọn gàng nếu bạn sử dụng 'IFS = '$ (printf' \ n \ t ')" ' – aggsol

+2

Hoặc chỉ là' echo $ ( Normadize

2

Dưới đây là phương pháp sử dụng ex biên tập:

  • J oin tất cả dòng và p rint đến đầu ra tiêu chuẩn:

    $ ex +%j +%p -scq! file 
    
  • J oin tất cả các dòng tại chỗ (trong file):

    $ ex +%j -scwq file 
    

    Lưu ý: Điều này sẽ nối tất cả các dòng trong tập tin nó- tự!