web-dev-qa-db-fra.com

Utilisation de sed pour scinder une chaîne avec un délimiteur

J'ai une chaîne au format suivant:

string1:string2:string3:string4:string5

J'essaie d'utiliser sed pour scinder la chaîne sur : et imprimer chaque sous-chaîne sur une nouvelle ligne. Voici ce que je fais:

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

Cela imprime:

string1
string2:string3:string4:string5

Comment puis-je le faire se scinder sur chaque délimiteur?

40
hax0r_n_code

Pour diviser une chaîne avec un délimiteur avec GNU sed, vous dites:

sed 's/delimiter/\n/g'     # GNU sed

Par exemple, pour scinder en utilisant : en tant que délimiteur:

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

Ou avec un sed non-GNU:

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

Dans ce cas particulier, vous avez omis la g après la substitution. Par conséquent, cela ne se fait qu'une fois. Voir:

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

g signifie global et signifie que la substitution doit être effectuée globalement, c'est-à-dire pour toute occurrence. Voir que la valeur par défaut est 1 et si vous mettez pour exemple 2, il est fait 2 fois, etc.

Tous ensemble, dans votre cas, vous devez utiliser:

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

Notez que vous pouvez utiliser directement la syntaxe sed ... file au lieu de la tuyauterie inutile: cat file | sed.

52
fedorqui

L'utilisation de \n dans sed n'est pas portable. La manière portable de faire ce que vous voulez avec sed est:

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

mais en réalité, ce n'est pas un travail pour sed de toute façon, c'est le travail que tr a été créé pour faire:

tr ':' '
' < ~/Desktop/myfile.txt
27
Ed Morton

En utilisant simplement tr :

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

Si vous avez vraiment besoin de sed :

$ sed 's/:/\n/g' <<< string1:string2:string3:string4:string5
string1
string2
string3
string4
string5
22
Gilles Quenot

Cela pourrait fonctionner pour vous (GNU sed):

sed 'y/:/\n/' file

ou peut-être:

sed y/:/$"\n"/ file
3
potong

Cela devrait le faire:

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

Si vous utilisez gnu sed, vous pouvez utiliser \x0A pour newline:

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