web-dev-qa-db-fra.com

Remplacement de certains caractères d'une chaîne par un autre caractère

J'ai une chaîne comme AxxBCyyyDEFzzLMN et je souhaite remplacer toutes les occurrences de x, y et z par _.

Comment puis-je atteindre cet objectif?

Je sais que echo "$string" | tr 'x' '_' | tr 'y' '_' fonctionnerait, mais je veux le faire en une fois, sans utiliser de tuyaux.

245
Amarsh
echo "$string" | tr xyz _

remplacerait chaque occurrence de x, y ou z par _, donnant A__BC___DEF__LMN dans votre exemple.

echo "$string" | sed -r 's/[xyz]+/_/g'

remplacerait les occurrences répétées de x, y ou z par un seul _, donnant A_BC_DEF_LMN dans votre exemple.

287
jkasnicki

Utilisation de Expansion du paramètre Bash :

orig="AxxBCyyyDEFzzLMN"
mod=${orig//[xyz]/_}
256
Matthew Flaschen

Vous pourriez trouver ce lien utile:

http://tldp.org/LDP/abs/html/string-manipulation.html

En général,

Pour remplacer la première correspondance de $ sous-chaîne par $ remplacement:

${string/substring/replacement}

Pour remplacer toutes les correspondances de $ sous-chaîne par $ remplacement:

${string//substring/replacement}

EDIT: Notez que cela s’applique à une variable nommée $ string.

91
Dylan Daniels
read filename ;
sed -i 's/letter/newletter/g' "$filename" #letter

^ utilisez-en autant que vous le souhaitez et créez votre propre cryptage BASIC

5
Michael

Voici une solution avec l’extension des paramètres du shell qui remplace plusieurs occurrences contiguës par un seul _:

$ var=AxxBCyyyDEFzzLMN
$ echo "${var//+([xyz])/_}"
A_BC_DEF_LMN

Notez que le motif +(pattern) nécessite une correspondance étendue, activé avec

shopt -s extglob

Alternativement, avec l'option -s ("squeeze") de tr:

$ tr -s xyz _ <<< "$var"
A_BC_DEF_LMN
5
Benjamin W.