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.
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.
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.
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários