Como usar o grep em uma variável ou string?

2

Estou escrevendo um script bash e preciso verificar se um nome de arquivo tem um número no final (após um período) e, em caso afirmativo, obtê-lo, mas não consigo descobrir como usar regex em uma variável ou string.

Eu pude usar echo no terminal para enviar uma string para o grep, assim:

 echo "filename.txt.123" | egrep -o "\.[0-9]+$" | egrep -o "[0-9]+"

Mas preciso atribuir a saída disso a uma variável. Eu tentei fazer isso:

 revNumber= echo "filename.txt.123" | egrep -o "\.[0-9]+$" | egrep -o "[0-9]+"

Mas isso não funciona. Eu tentei um monte de outras coisas também, mas nada era válido.

No meu script bash eu quero usar o grep em uma variável e não em uma string, mas o conceito aqui é o mesmo.

Como posso usar o grep em uma string ou variável e depois salvar o resultado em outra variável?

    
por Nate 12.09.2014 / 20:17

3 respostas

5

Para atribuir a saída de um comando a uma variável, use $() :

revNumber=$(echo "filename.txt.123" | egrep -o "\.[0-9]+$" | egrep -o "[0-9]+")

Se tudo o que importa é correspondência , você pode querer considerar case :

case foo in
  f*) echo starts with f
   ;;
  *) echo does not start with f
   ;;
esac
    
por 12.09.2014 / 20:25
0

Por que o excesso de E / S de eco e grep, sugiro usar os recursos de processamento de string bash:

TESTFNAME="filename.txt.283" # you can collect this from doing an ls in the target directory

# acquire last extension using a regexp, including the '.':
FEXT=$(expr "$TESTFNAME" : '.*\(\.[[:digit:]][[:digit:]]*\)')

# check if length is more than just the dot, that means we've got digits:
if [  ${#FEXT} -gt 1 ]; then
    echo "Gotcha!" $testFilename ${#FEXT} $FEXT # do whatever you like with the file
fi

O regex pode ser otimizado e não é perfeito, mas aqui está o básico:

  • . * no começo pesquisará no final do arquivo.
  • [[: digit ::]] é quase o mesmo que [0-9], mas eu acho mais legível

Confira outros recursos de manipulação de strings bash no TLDP aqui .

    
por 13.09.2014 / 12:42
0

O abaixo é outra opção que usa uma comparação de expressões regulares bash antes de extrair o valor no final da string.

if [[ $TESTFNAME =~ \.[0-9]+$ ]]; then
  VAL=$(egrep -o '[0-9]+$' <<<"$TESTFNAME")
fi
    
por 15.09.2014 / 14:25

Tags