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.
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.
Utilisation de Expansion du paramètre Bash :
orig="AxxBCyyyDEFzzLMN"
mod=${orig//[xyz]/_}
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.
read filename ;
sed -i 's/letter/newletter/g' "$filename" #letter
^ utilisez-en autant que vous le souhaitez et créez votre propre cryptage BASIC
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