Помощь в изучении sed

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

voidius
Сообщения: 59
ОС: Arch Linux

Помощь в изучении sed

Сообщение voidius »

Читаю "Краткий учебник по SED" drBatty.

Возникли некоторые вопросы, один из них:
Вот более сложный пример со спец-символом:

echo "ABCDEEEEDG" | sed -r 's/DE*/z/'
ABCzDG
Регулярные выражения следует читать слева-направо, потому как именно так они и просматриваются командой sed. Это выражение означает: Найти букву D, за которой идёт буква E, которая повторяется любое число раз. Тут видно что во-первых, спец-символ `*' действует только на один обычный символ(на букву E в данном случае), и во-вторых, видна жадность звёздочки, она захватила не "любоё" количество E, а всё что смогла. В sed все модификаторы ведут себя точно так-же, и нет никакой возможности изменить это поведение, это очень полезно для ускорения работы наших скриптов. На самом деле наша строка делится на четыре части:

"ABC"
которая не подходит под шаблон /DE*/
"DEEEE"
которая подходит под шаблон, причём подходит пятью способами: "D", "DE", "DEE", "DEEE", и "DEEEE".
"D"
, эта часть подходит одним способом.
"G"
это не подходит.

Почему "DEEEE" подходит 5тью, а в "D" одним способом? Ведь шаблон DE* означает, что как минимум должно существовать как D, так и E! Ну, и максимум DE с любым колличеством последующих E. То есть я понимаю так, что "DEEEE" подходит 4мя способами (DE, DEE, DEEE, DEEEE), а "D" не подходит так же, как "ABC" и "G"...

Уже несколько раз возвращался к этому моменту, но никак не могу въехать.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: Помощь в изучении sed

Сообщение /dev/random »

voidius писал(а):
21.02.2010 00:04
Почему "DEEEE" подходит 5тью, а в "D" одним способом? Ведь шаблон DE* означает, что как минимум должно существовать как D, так и E! Ну, и максимум DE с любым колличеством последующих E. То есть я понимаю так, что "DEEEE" подходит 4мя способами (DE, DEE, DEEE, DEEEE), а "D" не подходит так же, как "ABC" и "G"...

Уже несколько раз возвращался к этому моменту, но никак не могу въехать.

* - это 0 и более
+ (или \+ в BRE) - это 1 и более
? (или \? в BRE) - 0 или 1
Спасибо сказали:
voidius
Сообщения: 59
ОС: Arch Linux

Re: Помощь в изучении sed

Сообщение voidius »

а, ну да, ведь шаблон /.*/ подходит и к пустой строке.
А предпоследний символ в строке (D) не меняется на z потому что нет модификатора g и sed останавливается после первой замены.

Спасибо.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Помощь в изучении sed

Сообщение drBatty »

voidius писал(а):
21.02.2010 00:25
А предпоследний символ в строке (D) не меняется на z потому что нет модификатора g и sed останавливается после первой замены.

Спасибо.

хм... ладно, как-нибудь поменяю. хотя я вроде явно указал: "сколько угодно"...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: