문자를 삽입하기 전에 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}의미합니다 . 예를 들어 수량자는 다음 과 같이 표현될 수 있습니다 . 생략은 상한이 없다는 것을 의미합니다. 로 쓸 수 있습니다 . 마지막으로 평균은 이전 원자와 정확히 일치합니다 .nm?{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자리라고 가정합니다.

관련 정보