Verifique se o conteúdo do arquivo tem comprimento X e contém apenas caracteres específicos

4

Digamos que eu tenha arquivos que contenham apenas um docker id:

myid.id :

28fe2baadbe8da32ed0b99c69b11c01b2d141bc5b732b81e0960086de52fc891

Eu quero verificar se o conteúdo de my.id é exatamente 64 caracteres e contém apenas caracteres no intervalo [0-9] e [a-z] (talvez [a-f]).

  • Como posso fazer isso?
  • Se o arquivo contiver uma nova linha 0x0a , como posso incluí-la / incluí-la nessa verificação?
por polym 25.07.2014 / 18:22

4 respostas

5

Tente:

$ echo 28fe2baadbe8da32ed0b99c69b11c01b2d141bc5b732b81e0960086de52fc891 | 
awk '{sub(/\r/,"")} length == 64 && /^[[:xdigit:]]+$/'
28fe2baadbe8da32ed0b99c69b11c01b2d141bc5b732b81e0960086de52fc891

ou use perl .

Incluir nova linha:

perl -ne 'print if length == 64 and /^[[:xdigit:]]+$/'

Excluir nova linha:

perl -nle 'print if length == 64 and /^[[:xdigit:]]+$/'
    
por 25.07.2014 / 18:28
5

Que tal uma linha inteira grep

grep -qxE '[[:xdigit:]]{64}' myid.id && echo "yes"

ou (não tenho certeza sobre isso) bash-specific

IFS= read -r id < myid.id 
[[ ${#id} -eq 64 ]] && [[ $id =~ [[:xdigit:]]{64} ]] && echo "yes"
    
por 25.07.2014 / 18:58
2
read s <./file
[ ${#s} -eq 64 ] &&
[ -n "${s##*[![:alnum:]]*}" ] && 
echo success\!

Se decidir restringir o teste a a-f , altere [:alnum:] para [:xdigit:] . Embora valha a pena mencionar que qualquer aplicativo usando as classes POSIX [:alnum:] e / ou [:xdigit:] também corresponderá a A-[ZF] - é parte da especificação ... Se isso é um problema que você pode querer para adicionar mais um teste como:

...&& [ -n "${s##*[[:upper:]]*}" ] &&...
    
por 26.07.2014 / 05:19
1

Experimente:

 echo 28fe2baadbe8da32ed0b99c69b11c01b2d141bc5b732b81e0960086de52fc891 | grep [:0-9a-z:] |  wc -c
    
por 25.07.2014 / 18:52

Tags