これは私が実行したコマンドの結果です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
私のコマンドの問題は、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