2013-08-14 18 views
30

ho una stringa nel seguente formato:Usando sed per dividere una stringa con un delimitatore

string1:string2:string3:string4:string5

Sto cercando di utilizzare sed per dividere la stringa su : e stampare ogni sotto-stringa su una nuova linea. Ecco quello che sto facendo:

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

Questo stampa:

string1 
string2:string3:string4:string5 

come posso ottenere che per dividere su ogni delimitatore?

+2

flag globale?/G? – Jiminion

+4

Potresti considerare 'tr: '\ n' <~/Desktop/myfile.txt'. Dato che 'sed' può aprire i file abbastanza felicemente, non è necessario usare' cat' nell'esempio dalla domanda. –

risposta

39

per dividere una stringa con un delimitatore con sed dici:

sed 's/delimiter/\n/g' 

Ad esempio, per dividere con : come delimitatore:

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

In questo caso particolare, è mancato il g dopo la sostituzione. Quindi, è fatto una sola volta. Vedi:

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

g sta per g lobal e significa che la sostituzione deve essere fatto globalmente, cioè per ogni occorrenza. Vedere che il valore predefinito è 1 e se si mette ad esempio 2, è fatto 2 volte, ecc

Tutti insieme, nel tuo caso si avrebbe bisogno di utilizzare:

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

Si noti che è possibile direttamente utilizzare la sintassi sed ... file anziché le tubature non necessarie: cat file | sed.

+0

Dannazione! Ero così vicino Cosa fa il 'g'? E accetterò la tua risposta il più presto possibile. Grazie! –

+0

Rappresenta "globale" e significa che la sostituzione deve essere eseguita "globalmente", vale a dire per ogni occorrenza. Vedi che il valore predefinito è 1 e se inserisci l'esempio 2, è fatto 2 volte, ecc. – fedorqui

1

Questo dovrebbe farlo:

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

Uso inutile del gatto –

25

Utilizzando \n in sed è non portabile.Il modo portatile per fare quello che vuoi con sed è:

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

ma in realtà questo non è un lavoro per sed in ogni caso, è il lavoro tr è stato creato per fare:

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

Su iTerm, su MacOS, il carattere di fine riga può essere eseguito sull'input usando "alt + invio". Pratico trucco per dividere la variabile '$ PATH' btw. – GabLeRoux

1

Se 're utilizzando GNU sed quindi è possibile utilizzare \x0A per ritorno a capo:

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

Questo potrebbe funzionare per voi (GNU sed):

sed 'y/:/\n/' file 

o forse:

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

Utilizzando semplicemente :

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

Se si ha realmente bisogno :

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

È piaciuta la soluzione utilizzando tr. Semplice e pratico. Grazie –

Problemi correlati