2013-08-14 18 views
30

Ich habe eine Zeichenfolge im folgenden Format zu spalten:Mit sed eine Zeichenfolge mit Trennzeichen

string1:string2:string3:string4:string5

Ich versuche sed zu verwenden, um spaltete die Zeichenfolge auf : und drucken jede Unterkette auf eine neue Zeile. Hier ist, was ich tue:

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

Diese Drucke:

string1 
string2:string3:string4:string5 

Wie kann ich es auf jeden Begrenzer aufgeteilt?

+2

globalen Flag? /G? – Jiminion

+4

Sie könnten 'tr: '\ n' <~/Desktop/myfile.txt' betrachten. Da 'sed' Dateien recht glücklich öffnen kann, müssen Sie in Ihrem Beispiel nicht' cat' aus der Frage verwenden. –

Antwort

39

Um eine Zeichenfolge mit Trennzeichen mit sed geteilt sagen Sie:

sed 's/delimiter/\n/g' 

Zum Beispiel mit : als Trennzeichen aufgeteilt:

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

In diesem speziellen Fall, Sie verpasste die g nach der Substitution. Daher wird es nur einmal gemacht. Siehe:

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

g für g steht lobaler und bedeutet, dass die Substitution weltweit getan werden muss, das heißt, für jedes Ereignis. Sehen Sie, dass der Standardwert 1 ist, und wenn Sie zum Beispiel setzen 2 wird 2 mal getan, usw.

Alle zusammen, in Ihrem Fall müssen Sie verwenden:

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

Beachten Sie, dass Sie direkt Verwenden Sie die sed ... file Syntax anstelle von unnötigen Rohrleitungen: cat file | sed.

+0

Verdammt! Ich war so nah. Was macht das 'g'? Und ich werde deine Antwort so schnell wie möglich annehmen. Vielen Dank! –

+0

Es steht für "global" und bedeutet, dass die Ersetzung "global" erfolgen muss, dh für jeden Fall. Sehen Sie, dass der Standardwert 1 ist und wenn Sie beispielsweise 2 eingeben, ist es 2 mal usw. – fedorqui

1

Dies sollte es tun:

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

Unbrauchbare Verwendung von cat –

25

\n in sed Verwendung ist nicht tragbar.Die tragbare Art und Weise zu tun, was Sie mit sed wollen, ist:

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

aber in Wirklichkeit diese für sed ohnehin kein Job ist, ist es die Aufgabe tr erstellt wurde, zu tun:

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

Auf iTerm, unter MacOS, kann das Endline-Zeichen an der Eingabe mit 'alt + enter' eingegeben werden. Praktischer Trick zum Aufteilen der '$ PATH'-Variable btw. – GabLeRoux

1

Wenn Sie ‚re Gnu mit sed, dann können Sie \x0A für newline verwenden:

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

Dies könnte für Sie arbeiten (GNU sed):

sed 'y/:/\n/' file 

oder vielleicht:

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

Mit einfach :

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

Wenn Sie wirklich brauchen:

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

Ich mochte die Lösung mit tr. Einfach und praktisch. Vielen Dank –

Verwandte Themen