Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: sed, удаление оставшейчя части строки  (Прочитано 21227 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн terrible_user

  • Автор темы
  • Активист
  • *
  • Сообщений: 438
    • Просмотр профиля
Добрый день,
никак не могу понять как с помощью sed (если это конечно можно)  найти регулярное выражение в строке и удалить весь текст  в строке, идущий после него. Само выражение не удалять.
Или удалить все кроме найденного рег выражения в строке.
Подскажите какие есть варианты.
Бери больше, кидай дальше

Оффлайн Svertal

  • Активист
  • *
  • Сообщений: 893
  • КиберПанк
    • Просмотр профиля
Re: sed, удаление оставшейчя части строки
« Ответ #1 : 28 Апреля 2009, 14:26:39 »
Рекомендую к ознакомлению, очень доходчиво написано, с примерами.

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: sed, удаление оставшейчя части строки
« Ответ #2 : 28 Апреля 2009, 14:51:04 »
Пообедав, сообразил.  :)

Что-то вроде

s/(^.*)(регэксп).*/\1\2/
по второму пункту будет, соответственно
s/(^.*)(регэксп).*/\2/
« Последнее редактирование: 28 Апреля 2009, 14:53:00 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн terrible_user

  • Автор темы
  • Активист
  • *
  • Сообщений: 438
    • Просмотр профиля
Re: sed, удаление оставшейчя части строки
« Ответ #3 : 28 Апреля 2009, 15:12:52 »
Рекомендую к ознакомлению, очень доходчиво написано, с примерами.

Спасибо - отличный мануал. Начитавшись различных мануалов, все казалось бы где то рядом и просто
но меня интересует когда у нас нет разделения по словам и используется любое кол-во разных символов
строка на входе
qwerty-13_fbg  57--=123456789=-thjh
строка на выходе
qwerty-13_fbg  57--=123456
ищется последовательность из 6 цифр [0-9]{6} и удаляется все после

Пользователь решил продолжить мысль 28 Апреля 2009, 09:18:35:
Пообедав, сообразил.  :)

Что-то вроде

s/(^.*)(регэксп).*/\1\2/
по второму пункту будет, соответственно
s/(^.*)(регэксп).*/\2/

Во то что нужно СПАСИБО, 
дошло - тут указывается применения 1 И 2 правила а все остальное отбрасывается в первом случае

но не пойму почему он выводит больше цифр чем нужно
echo qwerty-13_fbg57--=111123456=-dfgdthjh | sed -e 's/\(^.*\)\([0-9]\{6\}\).*/\1\2/'
qwerty-13_fbg57--=111123456
разве он де должен был отрезать только шесть по 2 правилу
« Последнее редактирование: 28 Апреля 2009, 15:26:14 от terrible_user »
Бери больше, кидай дальше

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: sed, удаление оставшейчя части строки
« Ответ #4 : 28 Апреля 2009, 15:32:03 »
но не пойму почему он выводит больше цифр чем нужно
echo qwerty-13_fbg57--=111123456=-dfgdthjh | sed -e 's/(^.*)([0-9]{6}).*/12/'
qwerty-13_fbg57--=111123456
разве он де должен был отрезать только шесть по 2 правилу

Дело в жадности (greedy regexp).
Если вставить между 1 и 2 какой-нибудь символ, будет явно видно, что попало в 1, а что в 2

Как лечить, навскидку не соображу.  :)


Пользователь решил продолжить мысль 28 Апреля 2009, 11:40:31:
Сообразил.
Не понимаю, почему, но вот это сработало. :)

echo qwerty-13_fbg57--=111123456=-dfgdthjh | sed -e 's/\([^0-9]*\)\([0-9]\{6\}\).*/\1..\2/'
qwerty-13_fbg57--=..111123

Я поставил 2 точки между \1 и \2, чтобы было явно видно, что куда попадает.
Вроде бы, в 1 должно было попасть только "qwerty-"
« Последнее редактирование: 28 Апреля 2009, 15:48:27 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн terrible_user

  • Автор темы
  • Активист
  • *
  • Сообщений: 438
    • Просмотр профиля
Re: sed, удаление оставшейчя части строки
« Ответ #5 : 28 Апреля 2009, 15:55:18 »
Цитата
 
Цитировать
A.\{9\}$ Означает заглавную букву А, точно десятую по счету от конца строки.
это может все объяснить  отсчет 6 цифр с правой стороны, а все остальное считать как текст идущий до нужного выражения
Подставил тупо [0-9][0-9][0-9][0-9][0-9][0-9]  работает

Да это работает классно
sed -e 's/\([^0-9]*\)\([0-9]\{6\}\).*/\1\2/'но порядок выполнения правил - просто ставит в тупик
Бери больше, кидай дальше

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: sed, удаление оставшейчя части строки
« Ответ #6 : 28 Апреля 2009, 16:18:18 »
Цитировать
A.\{9\}$ Означает заглавную букву А, точно десятую по счету от конца строки.
Это означает "Буква А, потом любые символы в количестве 9 штук и конец строки". Это просто.

Да это работает классно
sed -e 's/\([^0-9]*\)\([0-9]\{6\}\).*/\1\2/'
Первое правило - "[^0-9]*" - означает "все, кроме цифр".  Я не понимаю, почему цифры-то туда попадают.
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн dmig

  • Старожил
  • *
  • Сообщений: 1668
    • Просмотр профиля
Re: sed, удаление оставшейчя части строки
« Ответ #7 : 28 Апреля 2009, 16:19:31 »
([^0-9]*) исправьте на ([^0-9]*?)
модификатор ? отменяет жадность квантификаторов * и +

АПД. не то немного, я имел в виду исходный (^.*), только что-то в данном случае жадность не переключается...
« Последнее редактирование: 28 Апреля 2009, 16:22:25 от dmig »

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Re: sed, удаление оставшейчя части строки
« Ответ #8 : 28 Апреля 2009, 16:24:30 »
только что-то в данном случае жадность не переключается...
Вот-вот. :)
Я никогда не пользовался sed. Может, там свои регэкспы, не очень совместимые с Perl?..
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн dmig

  • Старожил
  • *
  • Сообщений: 1668
    • Просмотр профиля
Re: sed, удаление оставшейчя части строки
« Ответ #9 : 28 Апреля 2009, 16:32:08 »
Я никогда не пользовался sed. Может, там свои регэкспы, не очень совместимые с Perl?..
похоже на то... да, используются регекспы posix

 

Страница сгенерирована за 0.028 секунд. Запросов: 23.