Я читал "Освоение регулярных выражений" Фриделя и пытался создать общее нежелезное выражение шаблона для строки, которая ограничена словом. Исходя из основ, где разделимое слово является всего лишь одним символом " a", выражение:
sed -r 's/([^a]*)(a)/\
(1)\1(2)\2(ALL)&(END)/g' <<<"xaxxaxxxaxxx...aa..."
(1)x(2)a(ALL)xa(END)
(1)xx(2)a(ALL)xxa(END)
(1)xxx(2)a(ALL)xxxa(END)
(1)xxx...(2)a(ALL)xxx...a(END)
(1)(2)a(ALL)a(END)...
из которого шаблон (со ссылкой на Friedl) может быть:
- [ нормальный * закрытие]
Переход к реальному многосимвольному разделителю < ab:
sed -r 's/([^a]*)((a[^b]*)*)(ab)/\
(1)\1(2)\2(3)\3(4)\4(ALL)&(END)/g' <<<"xabxxabxxxabxxx...abxxx...aabxxx...axxx...aaabxaabaxabaxaxabxaxaabxxaaabaaxxab..."
(1)x(2)(3)(4)ab(ALL)xab(END)
(1)xx(2)(3)(4)ab(ALL)xxab(END)
(1)xxx(2)(3)(4)ab(ALL)xxxab(END)
(1)xxx...(2)(3)(4)ab(ALL)xxx...ab(END)
(1)xxx...(2)a(3)a(4)ab(ALL)xxx...aab(END)
(1)xxx...(2)axxx...aa(3)axxx...aa(4)ab(ALL)xxx...axxx...aaab(END)
(1)x(2)a(3)a(4)ab(ALL)xaab(END)
(1)(2)ax(3)ax(4)ab(ALL)axab(END)
(1)(2)axax(3)axax(4)ab(ALL)axaxab(END)
(1)x(2)axa(3)axa(4)ab(ALL)xaxaab(END)
(1)xx(2)aa(3)aa(4)ab(ALL)xxaaab(END)
(1)(2)aaxx(3)aaxx(4)ab(ALL)aaxxab(END)...
из которого может быть шаблон:
- [ обычный * (специальный *) * закрытие]
Для последующего разделителя abc выражение специальное может быть расширено:
(a[^b]*)*(ab[^c]*)*
- Правильно ли это?
- Можно ли это доказать?
- Можно ли упростить выражение special?
- Есть ли более эффективные выражения для этого? нотабене Я не использую perl non-greedy '*?' оператора и избежать чередования.
- Где я могу найти справочный материал для этого типа проблемы (Фридль намекнул, но не остановился на опубликованном решении).