2013-08-14 55 views
30

Tôi có một chuỗi theo định dạng sau:Sử dụng sed để tách một chuỗi với một delimiter

string1:string2:string3:string4:string5

Tôi đang cố gắng sử dụng sed để phân chia các chuỗi trên : và in mỗi tiểu chuỗi trên một dòng mới. Đây là những gì tôi đang làm:

cat ~/Desktop/myfile.txt | sed s/:/\\n/

này in:

string1 
string2:string3:string4:string5 

Làm thế nào tôi có thể lấy nó để phân chia trên mỗi delimiter?

+2

cờ toàn cầu?/g? – Jiminion

+4

Bạn có thể xem xét 'tr: '\ n' <~/Desktop/myfile.txt'. Vì 'sed' có thể mở các tệp khá vui vẻ, bạn không cần sử dụng' cat' trong ví dụ của mình từ câu hỏi. –

Trả lời

39

Để chia một chuỗi với một dấu phân cách với sed bạn nói:

sed 's/delimiter/\n/g' 

Ví dụ, để chia sử dụng : như một delimiter:

$ sed 's/:/\n/g' <<< "he:llo:you" 
he 
llo 
you 

Trong trường hợp đặc biệt này, bạn bỏ lỡ số g sau khi thay thế. Do đó, nó chỉ được thực hiện một lần. Xem:

$ echo "string1:string2:string3:string4:string5" | sed s/:/\\n/g 
string1 
string2 
string3 
string4 
string5 

g là viết tắt của g lobal và có nghĩa là sự thay thế phải được thực hiện trên toàn cầu, có nghĩa là, đối với bất kỳ xảy ra. Xem mà mặc định là 1 và nếu bạn đặt ví dụ 2, nó được thực hiện 2 lần, vv

Tất cả cùng nhau, trong trường hợp của bạn, bạn sẽ cần phải sử dụng:

sed 's/:/\\n/g' ~/Desktop/myfile.txt 

Lưu ý rằng bạn có thể trực tiếp sử dụng cú pháp sed ... file, thay vì đường ống không cần thiết: cat file | sed.

+0

Damnit! Tôi đa đên rât gân. 'G' làm gì? Và tôi sẽ chấp nhận câu trả lời của bạn ngay khi có thể. Cảm ơn! –

+0

Nó là viết tắt của 'global' và có nghĩa là sự thay thế phải được thực hiện' global', nghĩa là, đối với bất kỳ ocurrence nào. Thấy rằng mặc định là 1 và nếu bạn đặt cho ví dụ 2, nó được thực hiện 2 lần, vv – fedorqui

1

này nên làm điều đó:

cat ~/Desktop/myfile.txt | sed s/:/\\n/g 
+3

Sử dụng vô dụng mèo –

25

Sử dụng \n trong sed là không cầm tay.Cách cầm tay để làm những gì bạn muốn với sed là:

sed 's/:/\ 
/g' ~/Desktop/myfile.txt 

nhưng trong thực tế đây không phải là một công việc cho sed dù sao, nó được công việc tr được tạo ra để làm:

tr ':' ' 
' < ~/Desktop/myfile.txt 
+1

Trên iTerm, trên MacOS, ký tự cuối có thể được thực hiện trên đầu vào bằng cách sử dụng 'alt + enter'. Thủ thuật tiện dụng để tách '$ PATH' biến btw. – GabLeRoux

1

Nếu bạn đang sử dụng gnu sed sau đó bạn có thể sử dụng \x0A cho newline:

sed 's/:/\x0A/g' ~/Desktop/myfile.txt 
3

Điều này có thể làm việc cho bạn (GNU sed):

sed 'y/:/\n/' file 

hoặc có lẽ:

sed y/:/$"\n"/ file 
20

Sử dụng đơn giản :

$ tr ':' $'\n' <<< string1:string2:string3:string4:string5 
string1 
string2 
string3 
string4 
string5 

Nếu bạn thực sự cần :

$ sed 's/:/\n/g' <<< string1:string2:string3:string4:string5 
string1 
string2 
string3 
string4 
string5 
+0

Thích giải pháp sử dụng tr. Đơn giản và tiện dụng. Cảm ơn –