grep 查找恰好包含 X 个字符的行/文件

grep 查找恰好包含 X 个字符的行/文件

这是我运行的命令的输出grep

[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);

我正在两个文件中查找 32 个字符长的字符串:fileAfileB。重要的是,fileA仅包含 32 个字符,没有换行符:

[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

我的命令的问题grep是它返回任何包含超过 32 个字符的行。我怎样才能使它返回仅包含 32 个字符的行。对我来说,问题是我无法修改正则表达式以匹配换行符,因为没有换行符。

我的预期输出很简单:

fileA:W0mMhUcRRnG8dcghE4qvk3JA9lGt8nDl

(注意:这是我已经用丑陋的解决方案解决的挑战,但在这种情况下我们只能使用grep管道或重定向输出是不允许的)

答案1

这有效。 ^表示行首,加上{32}您已有的,然后表示$行尾。

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

正如 @steeldriver 所指出的, posix grep 包含 -x ,因此以下方法也有效:grep -xE ".{32}" fileA fileB

答案2

根据GNU Grep 文档:

如果输入文件的最后一个字节不是换行符,grep 会默默地提供一个换行符。

因此,如果您使用 GNU grep,您应该能够照常使用行首/行尾锚点(^$),即使您没有处理格式正确的纯文本文件。

grep '^.\{32\}$' fileA fileB

相关内容