다음 줄을 표시하려면 정규식을 만들어야 합니다.포함하다94, 95, 96, 97, 99.
grep -P '(94|95|96|97|99)'
이 2자리 숫자 뒤에는 6자리 이상이 올 가능성이 가장 높지만, 사이에 공백이 있을 수 있으므로 제거해야 합니다.
sed 's/\(.\) /\1/g'
그런 다음 357, 00357 또는 +357에 대한 언급을 모두 삭제해야 합니다.
sed 's/\(357\|00357\|+357\)//g'
마지막으로 해야 할 일은 한 줄에 6자리만 있는지 확인하는 것입니다.뒤쪽에위에서 언급한 원본 2입니다. 그래서 각 행은포함하다94, 95, 96, 97, 99로 시작하는 총 8자리 숫자입니다. 숫자가 8개보다 많거나 적으면 해당 행은 나에게 쓸모가 없습니다.
각 줄에 94, 95, 96, 97 또는 99로 시작하는 숫자가 포함되어 있고 그 뒤에 6자리 숫자만 있는지 확인하고 해당 줄만 표시하려면 어떻게 해야 합니까?
입력은 다음과 같습니다.
2020-11-03 13:00 2020-11-03 14:00 99 123456
2020-11-03 13:00 2020-11-03 14:00 9412 3456
2020-11-03 13:00 2020-11-03 14:00 95123456
2020-11-03 13:00 2020-11-03 14:00 456345 3453543654567
2020-11-03 13:00 2020-11-03 14:00 +357678423683
2020-11-03 13:00 2020-11-03 14:00 00357584903
2020-11-03 13:00 2020-11-03 14:00 +35 799 1276 45
2020-11-03 13:30 2020-11-03 14:30 97123456
예상 출력은 다음과 같습니다
2020-11-03 13:00 2020-11-03 14:00 99123456
2020-11-03 13:00 2020-11-03 14:00 94123456
2020-11-03 13:00 2020-11-03 14:00 95123456
2020-11-03 13:00 2020-11-03 14:00 99127645
2020-11-03 13:30 2020-11-03 14:30 97123456
답변1
를 사용하면 perl
다음을 수행할 수 있습니다.
perl -lne 'if (/\t\K(?:(?:\+|00)? ?3 ?5 ?7 ?)?(9[4-9]( ?\d){6})\s*$/) {
s{}{$1 =~ s/ //gr}e; print}' < file
sed
다음과 동일합니다(확장 정규식 지원을 사용하여 구현한다고 가정) -E
.
eval "$(printf 'NL="\n" TAB="\t"')"
LC_ALL=C sed -E "
/$TAB((00|\+)?3 ?5 ?7 ?)?(9[4-9]( ?[0-9]){6})[[:space:]]*\$/!d
s//$TAB\\$NL\3/; # separate prefix and 8 digits
h; # save a copy
s/.*\n//; # extract 8 digits
s/ //g; # remove spaces among digits
G; # append saved copy and keep prefix and trimmed digits:
s/(.*)\n(.*)\n.*/\2\1/" < file
여기서는 입력 예와 같이 필드가 TAB으로 구분되어 있다고 가정하고 에서와 같이 거짓 긍정을 피하기 위해 TAB을 따를 때만 숫자를 찾습니다 +1 996 123456
.
답변2
awk를 사용하세요
awk '{
match($0,/^([^[:space:]]+[[:space:]]+){4}/)
last_part = substr($0,RLENGTH+1)
gsub(/[[:space:]]/,"",last_part)
gsub(/^(+|00)357/,"",last_part)
if (last_part ~ /^9[45679]/ && length(last_part) == 8) {
printf "%s%s\n", substr($0,1,RLENGTH), last_part
}
}' file
산출:
2020-11-03 13:00 2020-11-03 14:00 99123456
2020-11-03 13:00 2020-11-03 14:00 94123456
2020-11-03 13:00 2020-11-03 14:00 95123456
2020-11-03 13:00 2020-11-03 14:00 99127645
2020-11-03 13:30 2020-11-03 14:30 97123456
설명하다:
match()
처음 4개 필드를 공백과 일치시킨 후 내장 변수는RLENGTH
첫 번째 부분의 끝을 유지합니다. 필드로 분할할 수도 있지만 이 경우 초기 정렬을 유지하고 시작되는 숫자 범위의 인덱스(현재는 )와 쉽게 일치시키기 위해 분할하는 것을 좋아하지 않습니다RLENGTH+1
.gsub()
숫자 영역의 모든 공백을 제거 하여 시작하십시오 . 편의를 위해 이 작업을 두 단계로 수행합니다(다른 것에 대해 걱정하지 않기 위해+35 7
).두 번째 단계에서는
gsub()
접두사(+357
,00357
또는357
)를 찾아서 삭제합니다.마지막으로 숫자 범위가 원하는 접두사로 시작하는 경우그리고길이는 8자(
printf
개행 문자)입니다.
인용하다:GNU awk 문자열 함수
답변3
나는 다음과 일치할 것이다:
Space
9
5 through 9
0 or 1 Space
6 digits
a non-digit
grep -E ' 9[5-9] ?[0-9]{6}[^0-9]' file