Мне нужно отформатировать номера телефонов в текстовом файле. Они отображаются как (пример)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 цифр, как в вашем примере.