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

fileA両方のファイルで32文字の文字列を探しています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

私のコマンドの問題は、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

関連情報