Correspondência de Padrões - Linux

Os operadores de correspondência de padrões (pattern matching) permitem encontrar um padrão em uma variável e, se encontrado, modificar essa variável. Os operadores são os seguintes:

  • O operador ## é usado para encontrar a correspondência mais longa com o padrão desde o início da string.

  • O operador # é usado para encontrar a correspondência mais curta com o padrão desde o início da string.

  • O operador %% é usado para encontrar a correspondência mais longa com o padrão desde o final da string.

  • O operador % é usado para encontrar a correspondência mais curta com o padrão desde o final da string.

Vamos definir no diretório pessoal o seguinte script hello:

#!/bin/bash
# script que obtém o nome do arquivo
filename=${1##*/}
echo "The filename is $filename"
exit 0

Neste caso, a busca pelo padrão é aplicada ao identificador $1: o primeiro argumento passado ao script pela linha de comando. O operador ## é aplicado a este argumento, buscando a correspondência mais longa com o padrão */. Ou seja, o operador busca /, precedido por qualquer outro caractere *. Como o operador ## busca a correspondência mais longa, ele procura o último / na string e o remove, junto com tudo que o precede. Assim, do caminho completo do arquivo, obtemos apenas o nome do arquivo.

Execute o script e passe o caminho completo de um arquivo:

programicio@Programicio:~$ bash hello /home/programicio/Documents/hello.txt
The filename is hello.txt

Usando o operador #, podemos encontrar a correspondência mais curta. Por exemplo, vamos alterar o script da seguinte forma:

#!/bin/bash
# script que obtém o nome do arquivo
path=${1#*/}
echo "path: $path"
exit 0

Execute o script, passando o caminho do arquivo:

programicio@Programicio:~$ bash hello /home/programicio/Documents/hello.txt
path: home/programicio/Documents/hello.txt

Neste caso, o operador busca o primeiro caractere / no nome completo do arquivo e o remove, junto com tudo que o precede. É importante entender o papel do * nesses exemplos. O operador ${1#*/} remove o primeiro caractere / encontrado e tudo que o precede. O operador ${1#/} remove o primeiro caractere / em $1, apenas se o valor de $1 começar com /. No entanto, se houver algo antes de /, o operador não saberá o que fazer.

Outro exemplo, obteremos o caminho relativo do arquivo:

#!/bin/bash
# script que obtém o caminho relativo do arquivo
rel_path=${1#$PWD/}
echo "Relative path: $rel_path"
exit 0

Aqui, o padrão de busca é estabelecido com base na variável $PWD e o caractere /. Execute o script e passe o caminho absoluto completo do arquivo:

programicio{Programicio:~$ echo $PWD
/home/programicio
programicio{Programicio:~$ bash hello /home/programicio/Documents/hello.txt
Relative path: Documents/hello.txt

Os operadores %% e % são semelhantes, mas buscam a correspondência desde o final da string. Por exemplo, vamos alterar o script da seguinte forma:

#!/bin/bash
# script que obtém o diretório do arquivo
dirname=${1%/*}
echo "Directory: $dirname"
exit 0

Neste caso, o operador ${1%/*} busca o primeiro barra / desde o final (ou a última barra desde o início), após a qual há qualquer caractere. E toda a parte da string a partir desta barra é removida. Assim, obtemos o diretório do arquivo. Execute o script e passe o caminho completo de um arquivo:

programicio@Programicio:~$ bash hello /home/programicio/Documents/hello.txt
Directory: /home/programicio/Documents
Política de Privacidade

Copyright © www.programicio.com Todos os direitos reservados

É proibida a reprodução do conteúdo desta página sem autorização prévia do autor.

Contato: programicio@gmail.com