Sostituzione di alcuni personaggi in una stringa con un altro carattere

Ho una corda come

AxxBCyyyDEFzzLMN 

Voglio sostituire tutti y e z con _ modo che l’output sia

 A_BC_DEF_LMN 

Come farlo?

Conosco una serie di

 echo "$string" | tr 'x' '_' | tr 'y' '_' 

funzionerà, ma voglio farlo in un colpo solo, senza usare i tubi.

EDIT: I seguenti ha funzionato

 echo "$string" | tr '[xyz]' '_' 

 echo "$string" | tr xyz _ 

sostituirebbe ogni occorrenza di x , y o z con _ , dando A__BC___DEF__LMN nell’esempio.

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

sostituire le ripetizioni ricorrenti di x , y o z con un singolo _ , dando A_BC_DEF_LMN nell’esempio.

Utilizzo dell’espansione dei parametri Bash :

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

Potresti trovare utile questo link:

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

In generale,

Per sostituire la prima corrispondenza di $ sottostringa con $ di sostituzione:

 ${string/substring/replacement} 

Per sostituire tutte le corrispondenze di $ sottostringa con $ di sostituzione:

 ${string//substring/replacement} 

EDIT: si noti che questo si applica a una variabile denominata $ stringa.

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

^ usa quanti di questi hai bisogno e puoi creare la tua crittografia BASIC

Ecco una soluzione con l’espansione dei parametri della shell che sostituisce più occorrenze contigue con un singolo _ :

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

Si noti che il +( pattern ) richiede una corrispondenza estesa del modello, triggersta

 shopt -s extglob 

In alternativa, con l’opzione -s (“squeeze”) di tr :

 $ tr -s xyz _ <<< "$var" A_BC_DEF_LMN