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
。次の場合は、その行を印刷します。
- 配列には
@e
5つまたは6つの要素が含まれています。 - その要素には数値以外の文字は含まれていません(
\D
数値以外の文字と一致)。
- 配列には
答え4
awk '{l=$0; n = gsub(/[0-9]+/, "", l)}; n == 5 || n == 6'
(原理と同じです。ヨセフの答え)