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?
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 g
lobal 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
.
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
Cela pourrait fonctionner pour vous (GNU sed):
sed 'y/:/\n/' file
ou peut-être:
sed y/:/$"\n"/ file
Cela devrait le faire:
cat ~/Desktop/myfile.txt | sed s/:/\\n/g
Si vous utilisez gnu sed, vous pouvez utiliser \x0A
pour newline:
sed 's/:/\x0A/g' ~/Desktop/myfile.txt