전화번호 형식을 텍스트 파일로 지정해야 합니다. (예)로 나타납니다.8014516912
-
처음 3개 숫자 뒤에 를 삽입하고 -
다른 3개 숫자 뒤에 또 다른 숫자 를 삽입할 수 있도록 형식을 지정하려면 어떻게 해야 합니까 ?801-451-6912
전화번호가 포함된 모든 회선에 대해 어떻게 해야 합니까? 전화번호는 텍스트 사이에 있으므로 번호가 항상 동일한 색인에 있는 것은 아닙니다. 예를 들어 다음과 같을 수 있습니다.
atewfnwieug 8204919561
adw 8915617141
답변1
이를 위해서는 숫자 수량자가 필요합니다.
sed -r 's/\b([0-9]{3})([0-9]{3})([0-9]{4})\b/\1-\2-\3/' your_file
확장 정규식을 활성화하는 스위치 -r
는 POSIX가 아니므로 더 이식 가능한 솔루션은 다음과 같습니다.
perl -pe 's/\b([0-9]{3})([0-9]{3})([0-9]{4})\b/$1-$2-$3/' your_file
확장 정규식에서 수량자는 {n,m}
이전 원자와 최소 n
횟수 및 최대 m
횟수 일치를 의미합니다. 예를 들어, 수량자는 다음 ?
과 같이 표현될 수 있습니다 {0,1}
. 생략하면 m
상한이 없음을 의미합니다. +
로 쓸 수 있습니다 {1,}
. 마지막으로, {n}
이전 원자와 정확히 n
몇 번 일치하는지 의미합니다.
를 사용하려는 경우 sed
확장 정규식을 사용할 필요는 없습니다. 단지 기본 정규 표현식 형식이 가독성이 떨어질 뿐입니다.
sed 's/\b\([0-9]\{3\}\)\([0-9]\{3\}\)\([0-9]\{4\}\)\b/\1-\2-\3/' your_file
답변2
대신에 Perl을 사용하겠습니다.
$ perl -pe 's/\b(\d{3})(\d{3})(\d{4})\b/$1-$2-$3/' foo.txt
atewfnwieug 820-491-9561
adw 891-561-7141
다음과 같이 현장에서 수행할 수도 있습니다 sed
.
$ perl -i.bak -pe 's/\b(\d{3})(\d{3})(\d{4})/$1-$2-$3\b/' foo.txt
전화번호가 다음과 같은 문자 옆에 있을 수 있는 경우:
abcd1234567890abc
abcd1234567890
1234567890abc
대신 이것을 사용할 수 있습니다:
$ perl -pe 's/([^\d]*)(\d{3})(\d{3})(\d{4})([^\d]*)/$1$2-$3-$4$5/' foo.txt
abcd123-456-7890abc
abcd123-456-7890
123-456-7890abc
이러한 모든 선택은 귀하의 예에서와 같이 전화번호가 항상 10자리라고 가정합니다.