![grep 查找恰好包含 X 个字符的行/文件](https://linux22.com/image/68965/grep%20%E6%9F%A5%E6%89%BE%E6%81%B0%E5%A5%BD%E5%8C%85%E5%90%AB%20X%20%E4%B8%AA%E5%AD%97%E7%AC%A6%E7%9A%84%E8%A1%8C%2F%E6%96%87%E4%BB%B6.png)
这是我运行的命令的输出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 个字符长的字符串:fileA
和fileB
。重要的是,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