Grepを使用して5〜6個の数字のみを含む行を検索する

Grepを使用して5〜6個の数字のみを含む行を検索する

5〜6個の数字のみを含む行を見つけるにはどうすればよいですか?このような。

ケース1(先行スペースを含む)

           10      2       12      1       13

ケース2(前に空白なし)

   1       2       3       4       5        6

私はこれがうまくいくと思います。

grep -E '[0-9]{5}'

答え1

grep -E '[0-9]{5}'5桁以上の数字を探しています。必要なのは少なくとも1桁の数字5個です。

grep -E '[0-9]+([^0-9]+[0-9]+){4}'
  • [0-9]+- 少なくとも1桁の数字
  • [^0-9]+[0-9]+- 少なくとも1つの数字ではなく、文字が前に来る少なくとも1つの数字を含む数字。その後、これを4回繰り返して、数字ではなく数字で区切られた5つの数字を取得します。
  • 要件が正確に5の場合は、行全体が一致するように対応する正規表現を囲むことができます[^0-9](もちろんアンカーを含む)。
  • 必要なもの(適格かどうか1,2,3,4,6)に応じて、他の区切り文字を考慮することもできます。たとえば、科学的表記の正しい間違いは次のとおりです。したがって、区切り記号には背を[+-]?(([0-9]+(\.[0-9]+)?)|([0-9]?\.[0-9]+))([eE][+-][0-9]+)?含めることはできません.。コメントeのように空白かもしれません。mikeservあるいは、CSVレコードの場合はカンマでもかまいません。または、ロケールによってコンマが小数点区切りになります。[^0-9]あなたのニーズによって異なります。

答え2

私はそれよりも強いものを選びますgrep。これはPerlで行うことができます。

perl -ne 'print if s/\d+/$&/g == 5' your_file

正規表現置換は、\d+1つ以上の数字()で構成されるすべてのグループをそれ自体($&)で置き換えます。何もしません。s///演算子が正規表現を置き換えた回数を返すので、副作用にのみ使用されます。したがって、s///5つの数値セットが見つかった場合にのみ、その行が印刷されます。

答え3

その他perl:

$ perl -MList::Util=first -Tnle '
  s/^\s+|\s+$//g;
  @e = split /\s+/;
  print if @e == 5 || @e == 6 and !first {/\D/} @e;
' file
10      2       12      1       13

説明する

  • s/^\s+|\s+$//g線をトリミングします。

  • @e = split /\s+/行を配列に分割します@e

  • 次の場合は、その行を印刷します。

    • 配列には@e5つまたは6つの要素が含まれています。
    • その要素には数値以外の文字は含まれていません(\D数値以外の文字と一致)。

答え4

awk '{l=$0; n = gsub(/[0-9]+/, "", l)}; n == 5 || n == 6' 

(原理と同じです。ヨセフの答え)

関連情報