2013-08-14 23 views
30

Mam ciąg w następującym formacie:Korzystanie sed aby podzielić ciąg z separatora

string1:string2:string3:string4:string5

próbuję użyć sed podzielić ciąg na : i wydrukować każdą podnapis na nowa linia. Oto, co robię:

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

Drukuje:

string1 
string2:string3:string4:string5 

Jak mogę je podzielić na każdego separatora?

+2

globalną flagę? /sol? – Jiminion

+4

Możesz rozważyć użycie 'tr: '\ n' <~/Desktop/myfile.txt'. Ponieważ 'sed' może otwierać pliki całkiem szczęśliwie, nie musisz używać' cat' w twoim przykładzie z pytania. –

Odpowiedz

39

Aby podzielić ciąg z separatora z sed mówisz:

sed 's/delimiter/\n/g' 

Na przykład, aby podzielić stosując : jako ogranicznik:

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

W tym konkretnym przypadku, brakowało g po zmianie. Dlatego jest to zrobione tylko raz. Zobacz:

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

g oznacza g skroniowe i oznacza, że ​​zastępowanie ma być wykonane na całym świecie, czyli dla każdego wystąpienia. Zobacz, że domyślnie jest 1 i jeśli umieścisz na przykład 2, odbywa się 2 razy itd

Wszyscy razem, w twoim przypadku trzeba by użyć:

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

Zauważ, że można bezpośrednio użyj składni sed ... file, zamiast niepotrzebnych przewodów: cat file | sed.

+0

Cholera! Byłem tak blisko. Co robi 'g'? Przyjmę twoją odpowiedź tak szybko, jak tylko będę mógł. Dzięki! –

+0

Jest to skrót od "global" i oznacza, że ​​podstawienie musi być wykonane globalnie, to znaczy dla każdego wystąpienia. Domyślna wartość to 1, a jeśli wstawisz np. 2, zostanie to zrobione 2 razy itd. – fedorqui

1

ten powinien zrobić:

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

Bezużyteczne użycie kota –

25

Korzystanie \n w sed nie jest przenośny.Przenośny sposób do tego, co chcesz z sed jest:

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

ale w rzeczywistości nie jest to praca dla sed w każdym razie, jest to praca tr został stworzony, aby zrobić:

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

W systemie iTerm na MacOS znak końca linii może być wykonany na wejściu za pomocą 'alt + Enter'. Przydatna sztuczka do podziału zmiennej $ PATH'. – GabLeRoux

1

Jeśli „re za pomocą GNU sed można użyć \x0A dla nowej linii:

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

To może pracować dla Ciebie (GNU sed):

sed 'y/:/\n/' file 

czy może:

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

Korzystanie prostu :

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

Jeśli naprawdę potrzebujesz :

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

Podobało mi się rozwiązanie za pomocą tr. Prosty i poręczny. Dzięki –

Powiązane problemy