¿Por qué el '?' personaje regex produce una coincidencia en sed?

Tengo una cadena similar a ../../sdd1 e bash hacer coincidir sdd desde aquí. Estoy tratando de usar el siguiente command sed :

 echo "../../sdd1" | sed 's:.*\([az]\{3\}\)[0-9]?:\1:' 

y no produce una coincidencia.
Pero cuando uso

 echo "../../sdd1" | sed 's:.*\([az]\{3\}\)[0-9]\{0,1\}:\1:' 

entonces obtengo mi pareja, sdd .

Mi mejor suposition es que debería escapingme del ? también, similar a las llaves – lo intenté y funciona, pero no sé por qué.

Entonces la pregunta es, ¿por qué el [0-9]? regex no coincide con el 1 de sdd1 , o ¿por qué tenemos que escaping ? y las llaves?

De forma pnetworkingeterminada, sed usa BRE y necesitaría la opción -E o -r para usar ERE

Citando del manual de GNU sed

En GNU sed, la única diferencia entre expresiones regulares básicas y extendidas está en el comportamiento de unos pocos caracteres especiales: '?', '+', Paréntesis, llaves ('{}') y '|'.

Con la syntax básica (BRE), estos caracteres no tienen un significado especial a less que la barra invertida con el prefijo ('\'); Mientras que con la syntax extendida (ERE) se invierte: estos caracteres son especiales a less que estén precedidos por una barra invertida ('\').

entonces, para GNU sed , use

 $ echo '../../sdd1' | sed 's:.*\([az]\{3\}\)[0-9]\?:\1:' sdd $ echo '../../sdd1' | sed -E 's:.*([az]{3})[0-9]?:\1:' sdd 

para POSIX BRE , su segundo command es el path a seguir

 $ echo '../../sdd1' | sed 's:.*\([az]\{3\}\)[0-9]\{0,1\}:\1:' sdd