LINUX.ORG.RU

[регулярные выражения] извлечение подстроки из найденной строки ?

 


0

0

Здравствуйте уважаемые человеки!

Каким образом мне получить определенное подвыражение из найденной строки? Поясню на примере: cusd([0-9]*);

согласно спецификации регулярных выражений идентификатор обратного слeшa с нулем будет соответствовать найденной подстроке в скобках. какая програма в linux позволяет это сделать?

Deleted
Ответ на: комментарий от lazyklimm

[code=shell] echo «cusd0 cusd9 jhghj» | sed -n -e 's/\(cusd\([0-9]*\)\)/\2/gp' :) 0 9 jhghj [/code]

например

lazyklimm ★★★★★
()

> согласно спецификации регулярных выражений идентификатор обратного слeшa с нулем будет соответствовать найденной подстроке в скобках.

ты уверен? IMHO там нумерация найденных подстрок начинается с 1, что-то вроде

echo 12345|sed -n 's/.*\(2.*4\).*/\1/p'

pupok ★★
()

grep --only-matching

Deleted
()
Ответ на: комментарий от pupok

Именно.

Прошу прощения за профанацию, да, группы начинают нумерацию с 1 и в большинстве реализаций заканчиваються на 9.

Deleted
()

>> CUSD

Не USB-модем ли настраиваете?
http://paste.pocoo.org/show/236352/ для ZTE MF100

Ага, только у меня Sony Ericsson MD300. Пишу скрипты чтобы комфортно можно было пополнять счет, включать/выключать сам модем. С AT командами уже достаточно разобрался.

[code=shell] echo «cusd0 cusd9 jhghj» | sed -n -e 's/\(cusd\([0-9]*\)\)/\2/gp' :) 0 9 jhghj [/code]

например

спасибо. думал есть что с более простым синтаксисом. видимо придеться использовать sed.

А grep --only-matching - не подходит т.к. мне нужно из этой подстроки, что нашло, вырезать еще одно подвыражение.

Deleted
()

Выход найден

Задача решена средствами BASH. Все это есть в man bash. Рассказываю.

Интерпретатор баш имеет compound-commands(составные команды) и одна из них это [[ blablabla ]].

Эта составная команда поддерживает сравнение строк по шаблону используя расширенный синтаксис регулярных выражений с помощью операции сравнения «=~» (без кавычег). А все обратные ссылки (подвыражения) после выполнения этой команды будут отображены в массив BASH_REMATCH.

Пример:

[[ У\ вас\ на\ счету\ 50\ денег =~ счету\ ([0-9]*)\ денег ]]

Элемент массива ${BASH_REMATCH[1]} будет содержать 50, а BASH_REMATCH[0] будет содержать все найденное выражение.

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