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

내 명령의 문제점은 grep32자를 초과하는 모든 줄을 반환한다는 것입니다. 어떻게 하면 다시 돌아올 수 있나요?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

관련 정보