É possível fazer uma substituição dupla com uma string de shell?

6

Substituição simples é fácil:

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

Mork Shuttleworth

é possível fazer um duplo ao mesmo tempo?

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

Mork Shuggleworgh

Expressões regulares são suficientes como resposta, se for possível usá-las.

Obrigado

    
por Akiva 21.01.2017 / 22:13

3 respostas

10

Até onde eu sei, a única maneira de fazer isso nas versões atuais de bash é em duas etapas, por exemplo,

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

As tentativas de anular as substituições resultam em um erro:

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

Note que outros invólucros podem suportar tais substituições aninhadas, por ex. em zsh 5.2 :

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

É claro que ferramentas externas como tr , sed , perl podem fazer isso facilmente

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

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

$ tr at og <<< "$string"
Mork Shuggleworgh
    
por steeldriver 22.01.2017 / 01:38
6

Você está substituindo letras únicas, por isso use tr :

tr at og

Isso faz com que cada a seja substituído por o e cada t seja substituído por g . Com o seu exemplo:

ek@Io:~$ tr at og <<<'Mark Shuttleworth'
Mork Shuggleworgh
    
por Eliah Kagan 22.01.2017 / 00:00
-1

Tente

echo ${string/a/o} ${string/t/g}

Estou usando meu tablet, sem bash para testar.

Você pode querer finalizar a compra usando o comando printf de maneira muito mais flexível.

    
por John bailey 21.01.2017 / 23:22