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