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
.다음과 같은 경우 해당 줄을 인쇄합니다.
- 배열에는
@e
5개 또는 6개의 요소가 포함되어 있습니다. - 해당 요소에는 숫자가 아닌 문자가 포함되어 있지 않습니다(
\D
숫자가 아닌 문자와 일치).
- 배열에는
답변4
awk '{l=$0; n = gsub(/[0-9]+/, "", l)}; n == 5 || n == 6'
(원리와 동일합니다.요셉의 대답)