sed를 사용하여 문자를 삽입하기 전에 특정 양의 숫자를 감지하려면 어떻게 해야 합니까? ###-###-####

sed를 사용하여 문자를 삽입하기 전에 특정 양의 숫자를 감지하려면 어떻게 해야 합니까? ###-###-####

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

관련 정보