web-dev-qa-db-fra.com

Est-il possible de faire une double substitution avec une chaîne Shell?

La substitution simple est facile:

string="Mark Shuttleworth"
echo ${string/a/o}

Mork Shuttleworth

est-il possible de faire un double en même temps?

echo ${string/a/o string/t/g} #doesn't work, but you get the idea

Mork Shuggleworgh

Les expressions régulières suffisent comme réponse, s'il est possible de les utiliser.

Merci

6
Akiva

Autant que je sache, la seule façon de procéder dans les versions actuelles de bash consiste à utiliser deux étapes, par exemple.

$ string="Mark Shuttleworth"
$ string="${string//a/o}"; echo "${string//t/g}"
Mork Shuggleworgh

Les tentatives d'imbrication de substitutions entraînent une erreur:

$ echo "${${string//a/o}//t/g}"
bash: ${${string//a/o}//t/g}: bad substitution

Notez que d'autres shells peuvent prendre en charge de telles substitutions imbriquées, par exemple. dans zsh 5.2:

~ % string="Mark Shuttleworth"
~ % echo "${${string//a/o}//t/g}"
Mork Shuggleworgh

Bien sûr, des outils externes tels que tr, sed, Perl peuvent le faire facilement.

$ sed 'y/at/og/' <<< "$string"
Mork Shuggleworgh

$ Perl -pe 'tr /at/og/' <<< "$string"
Mork Shuggleworgh

$ tr at og <<< "$string"
Mork Shuggleworgh
10
steeldriver

Vous remplacez des lettres simples, utilisez donc simplement tr :

tr at og

Cela entraîne le remplacement de chaque a par o et de chaque t par g. Avec votre exemple:

ek@Io:~$ tr at og <<<'Mark Shuttleworth'
Mork Shuggleworgh
6
Eliah Kagan