sed
не поддерживает нежадные алгоритмы, и квантификаторы будут соответствовать крайнему левому краю, поэтому необязательный c
в этом случае невозможен только с регулярным выражением. Вы можете использовать команды ветвления для этого конкретного примера.
$ # tested with GNU sed, syntax might differ for other implementations
$ # t command here will start next cycle if first s command succeeds
$ # so, the second s command will execute only if first one fails
$ printf 'abdef\nabcdef\n' | sed 's/.*cde.*/cde/; t; s/.*de.*/de/'
de
cde
Вы также можете использовать grep
, если он поддерживает опцию -o
(печатать только соответствующие части)
$ printf 'abdef\nabcdef\n' | grep -oE 'c?de'
de
cde