Я хотел бы заменить любое количество букв a или b (на самом деле, более длинные строки, поэтому классы символов не подойдут), но очевидная вещь терпит неудачу:
$ echo xab | sed -E 's/(a|b)*//'
xab
$ echo xab | sed 's/\(a\|b\)*//'
xab
Я бы ожидал, что каждый из них будет выводить только 'x'.
И с квантификатором + вместо квантификатора * вот что происходит.
Почему * не жаден здесь, и какой лучший подход к этому?
Один обходной путь - сначала соответствовать всему; например
$ echo xq-as | sed -E 's/(foo|bar|xq)(-as|-gh|-ts)*/\1/'
xq
, но сделать этот начальный матч - сложная задача.
Это похоже на то, что для соответствия двигателя RE требуется что-то без звездочки, чтобы согреть его.