##########
정기적으로 다양한 형식( , 등) 의 전화번호 ###-###-####
가 포함된 텍스트 파일을 받습니다. (###) ###-###
보통 10자리인데 그런 것도 본 적 있어요 +1 (###) ###-####
.
결국 파일은 데이터베이스로 가져왔지만 자세히 설명하지 않기 때문에 전화번호는 표준 형식으로 지정되었습니다 (###) ###-####
.
변경되지 않는 유일한 점은 전화번호가 항상 각 줄의 두 번째와 세 번째 탭 문자 사이에 있다는 것입니다.
명령줄에서 이 작업을 수행할 수 있는 방법이 있나요?
답변1
문서가 설명대로라면 이 내용도 적용됩니다. 이 명령은 전화번호 앞과 뒤의 정보를 보존하고 원하는 방식으로 형식을 지정합니다. 출력이 좋아 보이면 해당 위치에서 편집 -i
하는 옵션을 추가하거나 마지막에 사용하여 출력 리디렉션을 제공하세요.sed
> output_file
sed -E "s/(.*\t.*\t)\+?1?[[:space:]]?\(?([0-9]{3})\)?.*([0-9]{3}).*([0-9]{4})(.*)/\1\(\2\)\ \3-\4\5/g" filename
다음 텍스트가 포함된 파일에서 테스트했습니다.
jfk 902-765-9292 hat jump cat
jk 902 819 2244 hat jump cat
98 902 823-4456 hat jump cat
78h +1 075 242 1566 hat jump cat
jklj kjlj +1 075-242-1566 hat jump cat
jk jkj +1 (075) 242-1566 hat jump cat
kj (204) 799-9810 hat jump cat
kj 89 (204)-799-9810 hat jump cat
출력은 다음과 같습니다
jfk (902) 765-9292 hat jump cat
jk (902) 819-2244 hat jump cat
98 (902) 823-4456 hat jump cat
78h (075) 242-1566 hat jump cat
jklj kjlj (075) 242-1566 hat jump cat
jk jkj (075) 242-1566 hat jump cat
kj (204) 799-9810 hat jump cat
kj 89 (204) 799-9810 hat jump cat
답변2
모든 형식과 일치하고 숫자를 캡처한 다음 원하는 형식으로 바꾸는 정규식을 작성할 수 있습니다.
예를 들어 확장 정규식(ERE)을 사용하여 선택적으로 괄호로 묶인 10진수 3자리 시퀀스를 일치시키고 캡처하려면 일치하는 항목에 선택적 하이픈이나 공백을 \(?([0-9]{3})\)?
쓸 수 있습니다. [- ]?
이런 식으로 지어졌습니다
\(?([0-9]{3})\)?[- ]?([0-9]{3})[- ]?([0-9]{4})
괄호 안의 3자리 숫자(선택 사항)와 일치하며 선택적으로 하이픈이나 공백이 뒤따르고 추가 숫자(선택적으로 하이픈이나 공백이 뒤따름)와 4자리 숫자가 일치합니다.
대체에 표현식 적용 sed
:
$ cat <<EOF | sed -E 's/\(?([0-9]{3})\)?[- ]?([0-9]{3})[- ]?([0-9]{4})/(\1) \2-\3/g'
I periodically receive a text file with phone numbers formatted
in wildly different ways: 123 456-7890, 123 456-7890, 123 456-7890,
etc. Usually there's ten digits, but I've seen +1 555 456-7890.
EOF
I periodically receive a text file with phone numbers formatted
in wildly different ways: (123) 456-7890, (123) 456-7890, (123) 456-7890,
etc. Usually there's ten digits, but I've seen +1 (555) 456-7890.
답변3
필드를 일치시키고 형식을 다시 지정해야 합니다. 다음은 세 가지 변형을 찾아서 형식을 다시 지정하는 awk 스크립트입니다(기본적으로 재구성된 행을 인쇄하기 전).
$3 ~ /^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$/ {
$3="(" substr($3, 1, 3) ") " substr($3, 4, 3) "-" substr($3, 7, 4)
}
$3 ~ /^[0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$/ {
$3="(" substr($3, 1, 3) ") " substr($3, 5, 3) "-" substr($3, 9, 4)
}
$3 ~ /^\+1 \([0-9][0-9][0-9]\) [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$/ {
$3="(" substr($3, 5, 3) ") " substr($3, 10, 3) "-" substr($3, 14, 4)
}
1
파일(예: )에 저장한 phone.awk
후 다음을 사용하여 호출하세요 awk -F $'\t' -f phone.awk < input
.