이것은 내가 실행한 명령의 결과입니다 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