Нежадный разбор регулярных выражений на BASH

Аватар пользователя DRVTiny

Возможно ли это? sed совершенно точно не умеет осуществлять нежадный разбор и непонимает минимальные квантификаторы в стиле .+?
Использовать Perl для одной-единственной замены в строке как-то не хочется. Не знаю, может awk поддерживает модификаторы регекспов, позволяющие (локально хотя бы) изменять способ разбора с жадного на нежадный?

P.S. Мне нужно сделать замену в строке, так что pcregrep и практически эквивалентный ему grep -P в данном случае "отпадают"

Аватар пользователя ks

Re: Нежадный разбор регулярных выражений на BASH

Цитата:
sed совершенно точно не умеет осуществлять нежадный разбор

Не уверен, но гнутый кажется может. Пишу из винды, поэтому не могу проверить. Посмотри мануал по sed.
Копай в сторону расширенного синтаксиса. Включается параметром -r или -R, точно не помню.

Аватар пользователя ks

Re: Нежадный разбор регулярных выражений на BASH

Цитата:
sed совершенно точно не умеет осуществлять нежадный разбор

Да ты прав. То о чем я говорил выше - это POSIX regexp, а там нежадного разбора нет.

Цитата:
Мне нужно сделать замену в строке

Можно sed помочь. Если проблема в том, что sed "жадничает", например,

$ echo 'fred aaa aaa aaa' | sed -e 's/fred.*aaa/bbb/'
bbb

то для того, чтобы он не захватывал последнее 'aaa', нужно в начале найти первое 'aaa' и промаркировать его:

$ echo 'fred aaa aaa aaa' | sed -ne 's/aaa//
> s/fred.*/bbb/
> p'
bbb aaa aaa

В первой строке мы заменяем aaa на , а уже потом меняем 'fred.*' на 'bbb'

Аватар пользователя ks

Re: Нежадный разбор регулярных выражений на BASH

Продолжение мысли Улыбка

Тут может быть проблема в том, что если встретится `aaa' без предшествующего fred,
то на выходе потока мы получим `'. Это решается добавлением всего одной строчки:

$ echo 'fred aaa aaa aaa' | sed -ne 's/aaa//
> s/fred.*/bbb/
> s//aaa/
> p'
bbb aaa aaa
$ echo 'aaa' | sed -ne 's/aaa//
> s/fred.*/bbb/
> s//aaa/
> p'
aaa

Ну и конечно маркеры должны быть уникальными.
Можно <> заменить на один предшествующий маркер, например,
$ echo 'fred aaa aaa aaa' | sed -ne 's/aaa/aaa/
> s/fred.*aaa/bbb/
> s/aaa/aaa/
> p'
bbb aaa aaa

или более "наворочено"
$ echo 'fred aaa aaa aaa' | sed -ne 's|aaa|aaa|
> s|fred.*aaa|bbb|
> s|aaa|aaa|
> p'
bbb aaa aaa

Аватар пользователя Bircoph

Re: Нежадный разбор регулярных выражений на BASH

А почему бы не использовать gawk? Регэкспы там неплохо работают, у меня ни разу
проблем не было.

Аватар пользователя DRVTiny

Re: Нежадный разбор регулярных выражений на BASH

Цитата:
А почему бы не использовать gawk? Регэкспы там неплохо работают, у меня ни разу
проблем не было.

Дело не в том, что они работают неплохо, а в том, что awk точно также, как и sed, не поддерживает полноценые PCRE со всякого рода хитрыми скобками вроде (?= ), (?: ), минимальными квантификаторами *? и +?, а также глобальными "модификаторами жадности".

RSS-материал