De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.


Troca de strings com expansão de parâmetros

Colaboração: Rubens Queiroz de Almeida

Data de Publicação: 12 de abril de 2023

Existem diversas formas de se realizar troca de uma sequência de caracteres por outra.

Por exemplo, suponhamos que queiramos trocar os sufixos de 1000 arquivos em um diretório de .doc para .txt:

$ time for f in *.txt; do mv $f `echo $f | sed "s/.txt/.doc/"`; done
real    0m4,625s
user    0m3,723s
sys     0m1,626s

Façamos o mesmo agora, porém usando expansão de parâmetros:

$ time for f in *.txt; do mv $f ${f/.txt/.doc}; done
real    0m1,678s
user    0m1,150s
sys     0m0,618s

Considerando o tempo real de execução (real), vemos que o processo foi 175,62% mais rápido! E mais simples também, veja que no primeiro exemplo usamos o echo e o sed, e isto envolve a criação de subprocessos, o que é sempre dispendiosos em termos de sistema. Se considerarmos o tempo do sistema (sys) vemos que é 2.63 vezes mais rápido.

As expansões de parâmetros em Bash são muito úteis para manipulação de strings. Uma das operações mais comuns é a troca de uma substring por outra.

Basicamente, a expansão de parâmetro ${Var/old/new} substitui a primeira ocorrência de "old" por "new" em $Var. Por exemplo:

$ Var="O rato roeu a roupa do rei de Roma"
$ echo ${Var/roeu/corroi}
O rato corroi a roupa do rei de Roma

Se você quiser substituir todas as ocorrências de "old" em $Var, use a expansão de parâmetro ${Var//old/new}:

$ Var="O rato roeu a roupa do rei de Roma"
$ echo ${Var//ro/u}
O rato ueu a upa do rei de Roma

Para substituirmos a string apenas se o início da string é igual a "old" usamos a expansão de parâmetros ${Var/#old/new}, ou seja, a substituição ocorrerá apenas se a string $Var começa com "old":

$ Var="old man"
$ echo ${Var/#old/new}
new man

Ao contrário, se quisermos que a substituição ocorra apenas se o final da string é igual a "old" usamos a expansão de parâmetro ${Var/%old/new}:

$ Var="batmanold"
$ echo ${Var/%old/new}
batmannew

As expansões de parâmetros permitem uso de metacaracteres coringa (os simples e os expandidos). Um exemplo com uma lista que, junto com o * e o ? são os coringas simples:

$ echo ${Var//[Rr]/X}
O Xato Xoeu a Xoupa do Xei de Xoma

Com estas técnicas de substituição, você pode manipular facilmente strings em Bash. É importante lembrar que todas estas expansões de parâmetros distinguem entre maiúsculas e minúsculas (case sensitive).

Se você quiser fazer uma substituição insensível a maiúsculas/minúsculas, use a ferramenta sed ou converta a string para maiúsculas/minúsculas antes de executar a expansão de parâmetros.

Saiba mais sobre expansão de parâmetros

Em nosso portal nós temos uma referência completíssima do uso de expansão de parâmetros, dividida em quatro artigos de autoria do Prof. Julio Neves:

Além disso, temos também uma playlist com 5 vídeos abordando em profundidade esse assunto:

»»» Programação Shell Linux - Expansão de Parâmetros

É importante notar que a expansão de parâmetros é uma operação muito rápida em comparação com outras operações em bash, como expressões regulares ou comandos externos. Portanto, é uma boa prática usar expansão de parâmetros sempre que possível para obter um melhor desempenho em scripts do bash.

Vale muito a pena investir nesse conhecimento, que vai fazer toda a diferença em sua carreira.

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários

Nenhum comentário ainda. Seja o primeiro!


Veja a relação completa dos artigos de Rubens Queiroz de Almeida