Encontre palavra na frase com Bourne Shell (sh)

3

Estou tentando determinar se uma determinada palavra aparece em uma frase usando Bourne Shell (sh). Por exemplo:

#!/bin/bash
INPUT='Lorem ipsum dolor sit amet.'

if [[ "$INPUT" == *dolor* ]]
then
    echo "So true"
else
    echo "Not true"
fi

Isso funciona em bash , mas não consigo usar bash , preciso de algo que funcione em sh

    
por user932865 20.09.2012 / 15:38

3 respostas

5

Eu suspeito que você quis dizer a sintaxe do shell POSIX em vez do shell Bourne, já que o shell Bourne está se tornando um dinossauro raro hoje em dia.

De qualquer forma, a resposta é a mesma em ambos os casos:

case $INPUT in
  *dolor*) echo true;;
  *) echo false;;
esac

O último ;; antes de esac não é obrigatório. A sintaxe POSIX também permite (*dolor*) .

    
por 20.09.2012 / 15:48
2

Você pode usar outras ferramentas:

  • grep : if echo "$INPUT" | grep --quiet '\bdolor\b'
por 20.09.2012 / 15:46
2

Caso você deseje portar palavras inteiras portavelmente, primeiro você precisa definir como as palavras são delimitadas. Se escolhermos a definição de GNU grep -w , então uma palavra é uma sequência de letras, números ou sublinhados (e um delimitador seria qualquer caractere que não seja nenhum deles). Infelizmente, a definição de "carta" é dependente de localidade. Os shells POSIX podem especificar letras (com [[: alpha:]], mas eu não sei de nenhuma variante do shell Bourne que tenha. Então, com um shell POSIX, você poderia fazer:

word_delimiter='[![:alnum:]_]'
case +$INPUT+ in
 (*${word_delimiter}dolor${word_delimiter}*) echo true;;
 (*) echo false;;
esac

E no shell Bourne, você teria que assumir as letras dos EUA:

word_delimiter='[!a-zA-Z0-9_]'
case +$INPUT+ in
  *${word_delimiter}dolor${word_delimiter}*) echo true;;
  *) echo false;;
esac

Outras opções:

if
  tr -cs '[:alnum:]_' '[\n*]' << EOF | grep -qx dolor
$INPUT
EOF
then
  echo true
else
  echo false
fi

Embora essa sintaxe seja POSIX, se você tiver que lidar com um sistema tão antigo quanto um que tenha um shell Bourne, você pode ter problemas com a sintaxe "tr", já que costumava haver duas variantes principais dele no antigo pre -POSIX dias.

    
por 20.09.2012 / 16:15