LINUX.ORG.RU

Sed. Замена в строке после определенного символа.

 , ,


0

2

Приветствую!
Каким образом можно заменить пробелы, скобки и дефисы после определенного символа? Например:

Иван Иванович Иванов number=+7 777 888 54 38
Петр Петрович Петров number=8(333)572-35-12
Иван Петрович ЖЭК number=+7 (495) 123-45-67
Привести нужно к виду:
Иван Иванович Иванов number=+77778885438
Sed-ом намучился уже. То съедает +7, то оставляет последние цифры.
Заранее благодарен.



Последнее исправление: Sabalt (всего исправлений: 1)

Не проще разбить строку на части, обработать их, а потом собрать заново? Например, так.

#!/bin/bash

while read line
do
        NAME=${line%=*}
        PHONE=${line#*=}
        PHONE=$(echo $PHONE | sed -r 's/( |-|\(|\))//g')
        echo "${NAME}=${PHONE}"
done < data.list

shell-script ★★★★★
()
Ответ на: комментарий от shell-script

Спасибо!

Именно то, что нужно! Очень Вам признателен!

Sabalt
() автор топика
Ответ на: AWK от yoghurt

yoghurt,

А что лучше использовать AWK или SED? Например, если список очень большой? Sed, почему-то, для меня менее устрашающе выглядит, чем Awk. ) Есть ли существенная разница?

Sabalt
() автор топика
Ответ на: yoghurt, от Sabalt

Если рассматривать эти два куска кода выше, то скрипт на awk будет выполнен одним процессом для всего входного файла, а вот на баше sed будет запускаться для каждой строчки. Поэтому, в теории, awk быстрее (при прочих равных).

Можно просто запустить и посмотреть :)

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

Спасибо!

Постараюсь познакомиться с awk поближе.

Sabalt
() автор топика
Ответ на: костыль от mix_mix

А почему костыль? Вроде тоже нормально отработал. Я правильно понял, что здесь sed ищет первое «циферное» совпадение? То есть нужны определенные требования к первой части списка, там где имена?

Sabalt
() автор топика
Ответ на: комментарий от Sabalt

Да, поэтому и костыль. Но если в именах на конце нет цифр, то всё будет работать как надо.

mix_mix ★★★★★
()

Спасибо всем! Тему отмечаю как решенную.

Sabalt
() автор топика
awk -F= '{gsub(/[ ()-]/,"",$NF);OFS="="}1'
mix_mix ★★★★★
()
Ответ на: комментарий от yoghurt

Впрочем, я уверен, что perl всех порвёт

Очевидный фикс

DELIRIUM ☆☆☆☆☆
()

perl -e 'foreach $line (<STDIN>){ $line =~ /(.*\=)(.*)/g; $tmp = $2; $tmp =~ tr/0-9//cd; print «$1+$tmp\n»}'

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.