Categories: Tecnologia

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

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

Por que isso é útil?

Pesquisar uma string por uma substring menor é um requisito comum. Um exemplo seria ler texto de um arquivo ou de entrada humana e pesquisar na string uma substring específica para que seu script possa decidir o que fazer a seguir. Pode estar procurando um rótulo ou nome de dispositivo em um arquivo de configuração ou uma sequência de comandos em uma linha de entrada de um usuário.

Os usuários do Linux são abençoados com vários utilitários para manipulação de texto . Alguns são integrados 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.

Algumas coisas que parecem ser arquivos não são arquivos simples. Eles 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á-lhes 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 eles 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 canalizaçã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 no texto que recebemos uma palavra, comando, rótulo ou algum outro indicador significativo é uma parte padrão do tratamento de 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

Os colchetes duplos “

 [[...]] 

“O teste de comparação de strings pode ser usado em ifinstruções 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"

outro

  echo "a chave não está no macaco"

fi

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

chmod +x duplo.sh

Vamos executar o script.

./duplo.sh

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

Em nosso exemplo, existem caracteres na frente da substring. Eles 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 passa.

Para maior flexibilidade, podemos modificar nosso script para lidar com 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"

outro

echo "$substring não foi encontrado em $string"

fi

Vamos ver como isso funciona.

./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 proporcionará maior flexibilidade.

Este é o script “double3.sh”.

#!/bin/bash

comprar -s nocasematch

string="Macaco"

substring="Chave"

maiúsculo = "Londres"

verificar_substring ()

{

se [[ $1 = *$2* ]]; então

echo "$2 foram encontrados em $1"

outro

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 check_substringfunção usando uma mistura de variáveis ​​e strings literais. Usamos sua opção (set) para set , para tornar as correspondências sem distinção entre maiúsculas e minúsculas .shopt -snocasematch

Veja como funciona.

./double3.sh

Também podemos usar o truque de agrupar a substring em asteriscos nas caseinstruções. Este é “caso.sh”.

#!/bin/bash

comprar -s nocasematch

string="Wallaby"

substring="Parede"

caso $string em

*$substring*)

echo "$substring foi encontrado em $string"

*)

echo "Nada corresponde: $string"

esac

Usar caseinstruções em vez de instruções muito longas ifpode facilitar a leitura e a depuração dos scripts. Se você precisasse verificar se uma string continha uma das muitas substrings possíveis, a caseinstrução seria a melhor escolha.

./caso.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 grepa capacidade inata de procurar uma string dentro de uma string para procurar nossas substrings.

Este script é denominado “subgrep.sh”.

#!/bin/bash

string="panela de mingau"

substring="cume"

if $(echo $string | grep -q $substring); então

echo "$substring foi encontrado em $string"

outro

echo "$substring não foi encontrado em $string"

fi

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

Se o resultado dos comandos entre parênteses ” (...)” for igual a zero, significa que foi encontrada uma correspondência. Como zero equivale a trueno Bash, a ifinstrução é satisfeita e a thencláusula é executada.

Vamos ver qual é a sua saída.

./subgrep.sh

Encontrando Substrings com sed

Também podemos usar sedpara encontrar uma substring.

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

"/$substring/p"

Nós alimentamos o valor do $stringuso sedde um redirecionamento aqui, <<<. Isso é usado para redirecionar valores para um comando no shell atual. Ele não invoca um subshell da mesma forma que um pipe faria.

O primeiro -né o teste. Ele retornará truese a saída do sedcomando for diferente de zero. A única maneira de a saída de sedser diferente de zero é se uma linha correspondente for encontrada. Se for esse o caso, $substringdeve ter sido encontrado em $string.

Este é “subsed.sh”.

#!/bin/bash

string="Suécia"

substring="éden"

if [ -n "$(sed -n "/$substring/p" <<< $string)" ]; então

echo "$substring foi encontrado em $string"

outro

echo "$substring não foi encontrado em $string"

fi

Obtemos a resposta esperada quando executamos o script.

./subsed.sh

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

./subsed.sh

Pare de procurar, encontrei

Outras ferramentas podem encontrar substrings, como awke Perlmas 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 procurar substrings é rápido, simples e não requer ferramentas externas.

maisroot

Recent Posts

O novo aplicativo “PC Manager” da Microsoft se parece muito com o CCleaner

Muitos aplicativos de limpeza estão disponíveis para Windows ao longo dos anos, mas hoje em…

1 ano ago

Como reiniciar um PS4

Seu PlayStation 4 está congelado? Seus jogos favoritos continuam travando? Reiniciar seu PS4 pode resolver…

1 ano ago

Veja por que as reticências são tão assustadoras ao enviar mensagens de texto…

A popularidade das mensagens de texto significou aprender uma forma totalmente nova de comunicação. Você…

1 ano ago

O telescópio James Webb acaba de capturar os “Pilares da Criação”

A foto dos "Pilares da Criação" tirada pelo Telescópio Espacial Hubble é uma das fotos…

1 ano ago

Você poderá baixar o Proton Drive mais cedo do que pensa

O Proton Drive saiu de seu estágio beta há algumas semanas, mas o aplicativo real…

1 ano ago

Como aumentar o zoom no Photoshop

Para ver suas fotos mais de perto ou para uma edição precisa , você pode…

1 ano ago