전화번호 형식을 텍스트 파일로 지정해야 합니다. (예)로 표시됩니다.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자리라고 가정합니다.