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자리 이상의 숫자를 찾고 있습니다. 필요한 것은 최소한 한 자리 이상의 숫자 5개입니다:

grep -E '[0-9]+([^0-9]+[0-9]+){4}'
  • [0-9]+- 최소 한 자리 이상의 숫자
  • [^0-9]+[0-9]+- 적어도 하나의 숫자가 아닌 문자가 앞에 오는 적어도 하나의 숫자를 포함하는 숫자입니다. 그런 다음 이를 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+하나 이상의 숫자( )로 구성된 모든 그룹을 자체( $&)로 대체합니다. 아무 작업도 수행하지 않습니다. 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' 

(원리와 동일합니다.요셉의 대답)

관련 정보