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

0
21


Local and Global Variables in Pytho...
Local and Global Variables in Python (Video 21)
fatmawati achmad zaenuri / Shutterstock.com

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

Por que é útil?

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

Os usuários do Linux são abençoados com uma infinidade 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 possuem recursos abundantes de manipulação de strings.

Algumas coisas que parecem ser arquivos não são arquivos simples. Eles são arquivos especiais representando 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, é claro, 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 redirecionamento e pipeline de entrada e saída. Essa funcionalidade suporta a capacidade de encadear scripts 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, tag 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.

Encontre substrings com Bash Builtins

Os colchetes duplos”[[...]]”O teste de comparação de strings pode ser usado em if instruçõ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 [[ "monkey" = *"key"* ]]; then
  echo "key is in monkey"
else
  echo "key is not in monkey"
fi

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

chmod +x double.sh

fazer 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, mesmo sem caracteres. Se a “chave” da substring for encontrada na string de destino, com ou sem caracteres iniciais ou finais, o teste retornará true.

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

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

#!/bin/bash

string="Monkey"
substring="key"

if [[ $string = *$substring* ]]; then
  echo "$substring was found in $string"
else
  echo "$substring was not found in $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="Monkey"
substring="Key"
capital="London"

check_substring ()
{
if [[ $1 = *$2* ]]; then
  echo "$2 was found in $1"
else
  echo "$2 was not found in $1"
fi
}

check_substring "Monkey" "key" 
check_substring $string $substring
check_substring $string "banana"
check_substring "Wales" $capital

nós chamamos nosso check_substring função usando uma combinação de variáveis ​​e strings literais. Nós usamos shopt com seu -s (definir) opção para configurar nocasematchpara que as correspondências não façam distinção entre maiúsculas e minúsculas.

É assim que funciona.

./double3.sh

Executando o script double3.sh

Podemos usar o truque de envolver a substring em asteriscos em case declarações também. Este é “case.sh”.

#!/bin/bash

shopt -s nocasematch

string="Wallaby"
substring="Wall"

case $string in

  *$substring*)
    echo "$substring was found in $string"
    ;;

  *)
    echo "Nothing matched: $string"
    ;;
esac

Vestindo case declarações em vez de muito longas if As declarações podem tornar os scripts mais fáceis de ler e depurar. Se eu precisasse verificar se uma string continha uma das muitas substrings possíveis, o case declaração seria a melhor opção.

./case.sh

Executando o script case.sh

A substring foi encontrada.

Encontrar substrings com grep

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

Este script é chamado de “subgrep.sh”.

#!/bin/bash

string="porridge pot"
substring="ridge"

if $(echo $string | grep -q $substring); then
  echo "$substring was found in $string"
else
  echo "$substring was not found in $string"
fi

O roteiro usa echo para enviar a string para grep, que procura a substring. estamos usando o -q opção (silencioso) para parar grep escrevendo qualquer coisa na saída padrão.

Se o resultado dos comandos entre parênteses “(...)“É igual a zero, significa que uma correspondência foi encontrada. porque zero é igual a true em bash, o if a declaração é atendida e then a cláusula é executada.

Vamos ver qual é a sua saída.

./subgrep.sh

Executando o script subgrep.sh

Encontrar substrings com sed

podemos usar sed para encontrar uma substring também.

Por defecto, sed imprime todo el texto que se introduce en él. Usando sed -n previene esto. Las únicas líneas que se imprimen son las líneas coincidentes. Esta expresión imprimirá cualquier línea que coincida o contenga el valor de $ subcadena.

"/$substring/p"

Alimentamos o valor de $string dentro de sed usando um redirecionamento aqui, <<<. Isso é usado para redirecionar valores para um comando no shell atual. Ele não invoca uma subcamada como um pipeline faria.

O primeiro -n é a prova. Retorna true se a saída de sed comando é diferente de zero. A única maneira de a saída de sed pode ser diferente de zero se uma linha correspondente foi encontrada. Se for o caso, $substring deve ter sido encontrado em $string.

Este é “subsed.sh”.

#!/bin/bash

string="Sweden"
substring="eden"

if [ -n "$(sed -n "/$substring/p" <<< $string)" ]; then
  echo "$substring was found in $string"
else
  echo "$substring was not found in $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.

./subscribed.sh

Execute o script subsed.sh com substring incompatível

pare de procurar eu encontrei

Outras ferramentas podem encontrar substrings, como awk S Perl mas um caso de uso simples como encontrar uma substring não garante sua funcionalidade adicional ou complexidade adicional. Em particular, usar as funções internas do Bash para pesquisar substrings é rápido, simples e não requer ferramentas externas.

RELACIONADO: Como usar instruções case em scripts Bash