Peut-on remplacer un caractère par deux?
J'essaie de remplacer "~" par "~\n" mais la sortie ne produit pas la nouvelle ligne.
$ echo "asdlksad ~ adlkajsd ~ 12345" | tr "~" "~\n"
asdlksad ~ adlkajsd ~ 12345
Non, tr
est spécifiquement destiné à remplacer des caractères uniques par des caractères uniques (ou, selon les options de la ligne de commande, de supprimer des caractères ou de remplacer les exécutions d'un caractère unique par une occurrence.).
sed
est probablement le meilleur outil pour ce travail particulier:
$ echo "asdlksad ~ adlkajsd ~ 12345" | sed 's/~/~\n/g'
asdlksad ~
adlkajsd ~
12345
(Notez que cela nécessite que sed
interprète la séquence backlash-n \n
comme un caractère de nouvelle ligne. GNU sed le fait, mais POSIX ne le spécifie pas, sauf dans une expression régulière. définitivement les anciennes versions de sed
qui ne le font pas.)
vous pouvez aller avec awk, laissez la variable FS/OFS faire le travail pour vous:
awk -F'~' -v OFS="~\n" '$1=$1'
testez avec votre exemple:
kent$ awk -F'~' -v OFS="~\n" '$1=$1' <<< "asdlksad ~ adlkajsd ~ 12345"
asdlksad ~
adlkajsd ~
12345
tr
ne peut faire que 1 à 1 traduction.
Voici une façon de faire en utilisant pur Bash:
s='"asdlksad ~ adlkajsd ~ 12345'
r=$'~\n'
echo -e "${s//\~/$r}"
asdlksad ~
adlkajsd ~
12345
non peut faire, désolé.
tr
est destiné à translittérer un caractère avec un autre.
il existe de nombreuses options, mais j’utiliserais awk
, c’est-à-dire.
echo "asdlksad ~ adlkajsd ~ 12345" | awk '{gsub(/[~]/, "&\n")};1'
sortie
asdlksad ~
adlkajsd ~
12345
echo "asdlksad ~ adlkajsd ~ 12345" | sed 's/~/~|/g' | tr '|' '\n'
Cela fonctionnera parfaitement, car sed a du mal à remplacer\n