Como saber se uma string Bash contém uma substring no Linux

Publicados: 2022-09-21
Laptop Linux mostrando um prompt bash
fatmawati achmad zaenuri/Shutterstock.com

Às vezes, em scripts Linux, você quer saber se uma string de texto contém uma string específica e menor. Existem diversas formas de fazer isto. Mostramos algumas técnicas simples e confiáveis.

Por que isso é útil?

Procurar uma string por uma substring menor é um requisito comum. Um exemplo seria ler texto de um arquivo ou de entrada humana e pesquisar a string por uma substring específica para que seu script possa decidir o que fazer em seguida. Ele pode estar procurando um rótulo ou nome de dispositivo em um arquivo de configuração ou uma string de comando em uma linha de entrada de um usuário.

Os usuários do Linux são abençoados com qualquer número de utilitários para manipulação de texto. Alguns são incorporados ao shell Bash, outros são fornecidos como utilitários ou aplicativos independentes. Há uma razão pela qual os sistemas operacionais derivados do Unix são ricamente servidos com recursos de manipulação de strings.

Como manipular strings no Bash no Linux
RELACIONADO Como manipular strings no Bash no Linux

Algumas coisas que parecem ser arquivos não são arquivos simples. São arquivos especiais que representam coisas como dispositivos de hardware e fontes de informações do sistema. A abstração realizada pelo sistema operacional dá a eles a aparência e as características dos arquivos. Você pode ler informações deles — como texto, naturalmente — e, em alguns casos, escrever para eles, mas não são arquivos comuns.

O texto também é usado como entrada e saída para comandos em uma janela de terminal. Isso permite o redirecionamento e a tubulação de entrada e saída. Essa funcionalidade sustenta a capacidade de encadear sequências de comandos do Linux, passando a saída de um comando como entrada para o próximo.

Independentemente de suas origens, pesquisar o texto que recebemos por uma palavra, comando, rótulo ou algum outro indicador significativo é uma parte padrão de lidar com dados baseados em texto. Aqui está uma coleção de técnicas simples que você pode incluir em seus próprios scripts.

Encontrando Substrings com Bash Builtins

O teste de comparação de strings de colchetes duplos “ [[...]] ” pode ser usado em instruções if para determinar se uma string contém outra string.

Copie este script em um editor e salve-o em um arquivo chamado “double.sh”.

 #!/bin/bash

if [[ "macaco" = *"chave"* ]]; então
  echo "a chave está no macaco"
senão
  echo "chave não está no macaco"
fi 
Como usar testes condicionais de colchete duplo no Linux
RELACIONADO Como usar testes condicionais de colchete duplo no Linux

Você precisará tornar o script executável com o comando chmod . Essa é uma etapa sempre necessária para tornar qualquer script executável. Você precisará fazer isso toda vez que criar um arquivo de script. Substitua o nome do script apropriado em cada caso.

 chmod +x double.sh 

tornando um script executável com chmod

Vamos executar o script.

 ./double.sh 

Executando o script double.sh

Isso funciona porque o asterisco ” * ” representa qualquer sequência de caracteres, incluindo nenhum caractere. Se a substring “key” estiver localizada dentro da string de destino, com ou sem caracteres na frente ou atrás dela, o teste retornará true.

Em nosso exemplo, há caracteres na frente da substring. Estes são correspondidos pelo primeiro asterisco. Não há letras atrás da substring, mas, como um asterisco também não corresponde a nenhum caractere, o teste ainda é aprovado.

Para flexibilidade, podemos modificar nosso script para manipular variáveis ​​em vez de strings literais. Este é o script “double2.sh”.

 #!/bin/bash

string="Macaco"
substring="chave"

if [[ $string = *$substring* ]]; então
  echo "$substring foi encontrado em $string"
senão
  echo "$substring não foi encontrado em $string"
fi

Vamos ver como isso funciona.

 ./double2.sh 

Executando o script double2.sh

Isso funciona da mesma maneira, com a vantagem de podermos usar nomes de variáveis ​​em vez de strings literais. Transformar nossa pequena solução em uma função fornecerá mais flexibilidade.

Este é o script “double3.sh”.

 #!/bin/bash

shopt -s nocasematch

string="Macaco"
substring="Chave"
capital="Londres"

check_substring()
{
if [[ $1 = *$2* ]]; então
  echo "$2 foi encontrado em $1"
senão
  echo "$2 não foi encontrado em $1"
fi
}

check_substring "Macaco" "chave" 
check_substring $string $substring
check_substring $string "banana"
check_substring "País de Gales" $capital

Chamamos nossa função check_substring usando uma mistura de variáveis ​​e strings literais. Usamos shopt com sua opção -s (set) para definir nocasematch , para tornar as correspondências insensíveis a maiúsculas e minúsculas.

Aqui está como ele funciona.

 ./double3.sh 

Executando o script double3.sh

Também podemos usar o truque de envolver a substring em asteriscos em instruções case . Este é "case.sh."

 #!/bin/bash

shopt -s nocasematch

string="Wallaby"
substring="Parede"

caso $string em

  *$substring*)
    echo "$substring foi encontrado em $string"
    ;;

  *)
    echo "Nada correspondente: $string"
    ;;
esac

Usar instruções case em vez de instruções if muito longas pode tornar os scripts mais fáceis de ler e depurar. Se você precisasse verificar se uma string continha uma das muitas substrings possíveis, a instrução case seria a melhor escolha.

 ./case.sh 

Executando o script case.sh

A substring foi encontrada.

Encontrando substrings com grep

Além dos recursos internos do Bash, a primeira ferramenta de pesquisa de texto que você provavelmente usará é o grep . Podemos usar a capacidade inata do grep para procurar uma string dentro de uma string para procurar nossas substrings.

Este script é chamado de “subgrep.sh.”

 #!/bin/bash

string="pote de mingau"
substring="cume"

if $(echo $string | grep -q $substring); então
  echo "$substring foi encontrado em $string"
senão
  echo "$substring não foi encontrado em $string"
fi

O script usa echo para enviar a string para grep , que procura a substring. Estamos usando a opção -q (quiet) para parar o grep de escrever qualquer coisa na saída padrão.

Como usar o comando grep no Linux
RELACIONADO Como usar o comando grep no Linux

Se o resultado dos comandos entre parênteses “ (...) ” for igual a zero, significa que foi encontrada uma correspondência. Como zero equivale a true no Bash, a instrução if é satisfeita e a cláusula then é executada.

Vamos ver qual é a sua saída.

 ./subgrep.sh 

Executando o script subgrep.sh

Encontrando Substrings com sed

Podemos usar sed para encontrar uma substring também.

Por padrão, o sed imprime todo o texto que é alimentado nele. Usar sed -n evita isso. As únicas linhas impressas são as linhas correspondentes. Essa expressão imprimirá todas as linhas que correspondam ou contenham o valor de $substring.

 "/$substring/p"

Alimentamos o valor de $string no sed usando um redirecionamento aqui, <<< . Isso é usado para redirecionar valores para um comando no shell atual. Ele não invoca um subshell da maneira que um pipe faria.

Como usar o comando sed no Linux
RELACIONADO Como usar o comando sed no Linux

O primeiro -n é o teste. Ele retornará true se a saída do comando sed for diferente de zero. A única maneira de a saída do sed ser diferente de zero é se uma linha correspondente for encontrada. Se for esse o caso, $substring deve ter sido encontrado em $string .

Este é "subsed.sh."

 #!/bin/bash

string="Suécia"
substring="eden"

if [ -n "$(sed -n "/$substring/p" <<< $string)" ]; então
  echo "$substring foi encontrado em $string"
senão
  echo "$substring não foi encontrado em $string"
fi

Obtemos a resposta esperada quando executamos o script.

 ./subsed.sh 

Executando o script subsed.sh

Podemos testar a lógica do script editando o valor de $substring para que a comparação falhe.

./subsed.sh

Executando o script subsed.sh com uma substring sem correspondência

Pare de Procurar, Encontrei

Outras ferramentas podem encontrar substrings, como awk e Perl , mas um caso de uso simples como encontrar uma substring não garante sua funcionalidade extra nem a complexidade adicional. Em particular, usar os recursos internos do Bash para pesquisar substrings é rápido, simples e não requer ferramentas externas.

RELACIONADO: Como usar instruções de caso em scripts Bash