2017-01-21 7 views
1

У меня есть входные записи, как это:печать номера мобильных телефонов с SED

Addison Clark asdj asjdasjd asjdasndasd 9098890099 BE ME BA 
Debby Adam asjhdj23 j23 j123jn123 123jnwjb12hg3 123jh123 jhj23 123 9283774849 MBA MIB PHD BE BA 

где первые две колонки содержат первую и фамилию, и среди остального текста в каждой строке может содержать что угодно, включая номер мобильного телефона. Моя цель - извлечь имя и фамилию и номер мобильного телефона.

Я попытался

sed -re 's/^(\b\w+\b) (\b\w+\b).*([0-9]{10}).*/\1 \2 \3/' 

, который работает совершенно нормально, но когда я изменить его на

sed -re 's/^(\b\w+\b) (\b\w+\b).*([0-9]+).*/\1 \2 \3/' 

Он печатает только первую цифру в мобильном нет, но не весь мобильные номера. Любая идея, что может быть неправильным во второй команде?

+0

Может ли это быть в пределах линии? мобильный номер? и существует ли фиксированная длина? – Inian

+0

да номер мобильного телефона фиксированная длина 10 цифр. он может быть где угодно в строке – Vicky

ответ

1

Просто используйте Awk с разделителем поля по умолчанию,

awk '{for(i=3;i<=NF;i++){if ($i ~ /^[[:digit:]]{10}$/) { number=$i; break } } printf "%s %s %s\n",$1,$2,number }' file 
Addison Clark 9098890099 
Debby Adam 9283774849 

Идея заключается в том, чтобы петля из 3rd поля до конца файла, чтобы соответствовать мобильному номеру шаблона и однажды обнаружила пролом из петли и печатей остальные поля.

Посмотрите на это, regEx tester page, который сказал для [0-9]+ матча

3rd Capturing Group ([0-9]+) 
Match a single character present in the list below [0-9]+ 
+ Quantifier — Matches between one and unlimited times, as many times as possible, giving back as needed (greedy) 
0-9 a single character in the range between 0 (ASCII 48) and 9 (ASCII 57) 

Посмотрите на то, что + квантор средства взяты из this page,

Ограничение Повторение

Там в дополнительный квантификатор, который позволяет вам указать, сколько раз токен может быть повторен. Синтаксис: {min, max}, где min равно нулю или положительное целое число, указывающее минимальное количество совпадений, а max - целое число, равное или большее, чем min, указывающее максимальное количество совпадений. Если запятая присутствует, но max опускается, максимальное число совпадений бесконечно. Итак, {0,1} совпадает с?, {0,} совпадает с *, а {1,} совпадает с +. Опуская как запятую, так и max, говорит двигателю, чтобы повторить токен ровно в мин..

+0

Спасибо за ответ, но я искал что-то не так с моей второй командой – Vicky

+0

@ user3369871: Обратитесь к моему обновлению о авторитетной попытке выяснить, почему ваше регулярное выражение не удалось. – Inian

+0

Спасибо, я получаю это сейчас. * Яркие совпадения до максимума при использовании [0-9] + и [0-9] + могут совпадать только с одним. – Vicky