web-dev-qa-db-fra.com

Comment remplacer un caractère par deux caractères en utilisant tr

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
21
Paolo

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.)

22
Keith Thompson

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
3
Kent

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
1
anubhava

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
1
shellter
echo "asdlksad ~ adlkajsd ~ 12345" | sed 's/~/~|/g' | tr '|' '\n'

Cela fonctionnera parfaitement, car sed a du mal à remplacer\n

0
Samanway