2009-09-14 39 views
13

Xin chào, làm thế nào để tôi thực hiện những điều sau đây trong BSD sed?Làm thế nào để sử dụng một dòng mới thay thế trong một BSD sed?

sed 's/ /\n/g' 

Từ trang-man nó nói rằng \ n sẽ được xử lý theo nghĩa đen trong chuỗi thay thế, làm cách nào để tránh hành vi này? Có người thay thế không?

Tôi đang sử dụng Mac OS Snow Leopard, tôi có thể cài đặt fink để lấy GNU sed.

+1

Chỉnh sửa nhỏ: '\ n' không được xử lý theo nghĩa đen, nó được dịch sang chữ' n' (nghĩa là '\' bị xóa; nhưng rõ ràng vẫn không phải là kết quả mong muốn). – mklement0

Trả lời

14

Trong một vỏ, bạn có thể làm:

sed 's/ /\ 
/g' 

nhấn phím Enter sau dấu chéo ngược để chèn một dòng mới.

+0

Tuyệt vời, cảm ơn Wooble. Có lý do nào được biết tại sao BSD sed không hỗ trợ \ n trong chuỗi thay thế? Chỉ tò mò thôi. –

+0

Tôi không chắc chắn, nhưng có vẻ như họ chỉ quyết định không hỗ trợ thoát ở tất cả trong chuỗi thay thế. sed 'y// \ n /' có vẻ hoạt động, mặc dù nó chỉ thay thế chuỗi; nếu bạn cần thay thế '' bằng một regex thì nó sẽ thất bại. Ngoài ra, \ n có vẻ là đặc biệt; \ r với bạn nhận được một 'r', không phải là một vận chuyển trở lại. – geoffspear

6

Một cách khác:

sed -e 's/ /\'$'\n/g' 

Xem here.

+2

+1, nhưng lưu ý rằng điều này dựa vào tính năng trình bao, [ANSI C trích dẫn] (http://www.gnu.org/software/bash/manual/bash.html#ANSI_002dC-Quoting) ('$ '.. .''), và một số hệ vỏ không hỗ trợ nó (ví dụ, 'dấu gạch ngang' - nó không phải là một phần của POSIX). Ngoài ra, ''s// \' $ '\ n' '/ g'' - nêm' $' \ n'' giữa hai chuỗi đơn được trích dẫn - là khái niệm rõ ràng và mạnh mẽ hơn. Ngoài ra, sử dụng '$ 's// \\\ n/g'' (lưu ý sự cần thiết phải thoát khỏi' \ '). – mklement0

4

Để dễ sử dụng, cá nhân tôi thường sử dụng

cr="\n" 
# or (depending version and OS) 
cr=" 
" 

sed "s/ /\\${cr}/g" 

nên nó sẽ nằm trên 1 dòng.

+1

Thú vị; tôi có thể đề nghị gọi biến 'nl' thay vì' cr' không? Giả sử bạn sử dụng một trình bao hỗ trợ [ANSI C quoting] (http://www.gnu.org/software/bash/manual/bash.html#ANSI_002dC-Quoting) (ví dụ: 'bash',' ksh', 'zsh '), bạn có thể đơn giản hóa việc gán cho' cr = $ '\ n''; sau đó bạn sẽ không phải lo lắng về sự khác biệt nền tảng. – mklement0

+0

lời khuyên mát mẻ, sur về '$ '\ n'' trên bất kỳ" unix "? nó thực sự sẽ giúp (Mặt trời của tôi cho tôi một số vấn đề về việc gán/hành động như vậy với '\ n') – NeronLeVelu

+1

' $ '\ n'' (ANSI-C quoting) sẽ hoạt động nếu bạn có đúng _shell_ ('bash', 'ksh', hoặc' zsh' - KHÔNG nằm trong các shell chỉ có POSIX-feature, chẳng hạn như 'dấu gạch ngang', do đó nền tảng không quan trọng. ('bash' đã giới thiệu tính năng này trong phiên bản 2.0 (một thời gian dài trước đây) - không chắc chắn về' ksh' và 'zsh', nhưng tôi mong đợi các hệ thống hiện tại có các phiên bản đủ gần đây). – mklement0

Các vấn đề liên quan