grep para linhas / arquivos que contenham exatamente X caracteres

0

Aqui está a saída de um comando grep que eu executei:

[user@localhost] : ~/Documents/challenge $ grep -i -e ".\{32\}" fileA fileB
fileA:W0mMhUcRRnG8dcghE4qvk3JA9lGt8nDl
fileB:observacion = new Observacion();
fileB:observacion.setCodigoOf(ordenBO.getCodigo());
fileB:observacion.setDetalle(of.getObservacion().getSolicitante());
fileB:observacion.setTipoObservacion(TipoObservacionOrdenFleteMaestro.SOLICITANTE);
fileB:observacion.setProceso(TipoProcesoObservacionMaestro.MODIFICACION);
fileB:observacion.setFecha(Utiles.getFechaSistema());
fileB:java.util.Date fechaHora = Calendar.getInstance().getTime();
fileB:observacion.setUsuarioCrecion(usuarioSesionado.getUsuario().getUsuario());
fileB:daoObservacion.agregaObservacion(observacion);

Estou procurando uma cadeia de 32 caracteres em dois arquivos: fileA e fileB . Importante: fileA contém exatamente 32 caracteres apenas, sem quebras de linha:

[user@localhost] : ~/Documents/challenge $ hexdump -C fileA
00000000  57 30 6d 4d 68 55 63 52  52 6e 47 38 64 63 67 68  |W0mMhUcRRnG8dcgh|
00000010  45 34 71 76 6b 33 4a 41  39 6c 47 74 38 6e 44 6c  |E4qvk3JA9lGt8nDl|
00000020

O problema com o comando grep é que ele está retornando qualquer linha que tenha mais de 32 caracteres. Como faço para retornar apenas linhas com exatamente 32 caracteres . O problema para mim é que não posso modificar minha regex para corresponder em uma quebra de linha, porque não há quebra de linha.

Meu resultado esperado seria simplesmente:

fileA:W0mMhUcRRnG8dcghE4qvk3JA9lGt8nDl

(nota: isto é para um desafio que já resolvi com a minha solução feia, mas neste cenário só podemos usar grep e não é permitida a passagem de tubulação ou redirecionamento)

    
por Juicy 14.07.2015 / 20:54

2 respostas

5

Isso funciona. ^ denota início de linha, mais {32} que você já teve e, em seguida, $ no final da linha.

$ cat fileA fileB
12345678901234567890123456789012
123456789012345678901234567890123
12345678901234567890123456789012
123456789012345678901234567890124
$ grep -E "^.{32}$" fileA fileB
fileA:12345678901234567890123456789012
fileB:12345678901234567890123456789012
$

E, como apontado por @steeldriver, o posix grep inclui -x, então a seguinte abordagem também funciona: grep -xE ".{32}" fileA fileB

    
por 14.07.2015 / 21:03
1

De acordo com a documentação do GNU Grep :

If the final byte of an input file is not a newline, grep silently supplies one.

Então, se você estiver usando o GNU grep, você deve ser capaz de usar as âncoras de início de linha / fim de linha ( ^ e $ ) como de costume, mesmo se você não estiver trabalhando em arquivos de texto simples corretamente formados.

grep '^.\{32\}$' fileA fileB
    
por 14.07.2015 / 21:11