Как использовать sed для обнаружения определенного количества цифр перед вставкой символа? ###-###-####

Как использовать sed для обнаружения определенного количества цифр перед вставкой символа? ###-###-####

Мне нужно отформатировать номера телефонов в текстовом файле. Они отображаются как (пример)8014516912

Как мне отформатировать его так, чтобы я мог вставить a -после первых 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 цифр, как в вашем примере.

Связанный контент