Por que o '?' caractere regex produz uma correspondência no sed?

Por que o '?' caractere regex produz uma correspondência no sed?

Eu tenho uma string semelhante ../../sdd1e tentando combinar sdda partir daqui. Estou tentando usar o seguinte sedcomando:

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

e não produz uma correspondência.
Mas quando eu uso

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

então eu consigo meu par, sdd.

Meu melhor palpite é que eu deveria escapar ?também, semelhante às chaves - tentei e funcionou, mas não sei por quê.

Então a questão é: por que o [0-9]?regex não corresponde ao 1from sdd1ou por que temos que escapar do ?e das chaves?

Responder1

Por padrão, sedusa BRE e seria necessário -Eou -ropção de usar ERE

Citando deManual do GNU sed

No GNU sed a única diferença entre expressões regulares básicas e estendidas está no comportamento de alguns caracteres especiais: '?', '+', parênteses, colchetes ('{}') e '|'.

Com a sintaxe básica (BRE), esses caracteres não têm significado especial, a menos que sejam prefixados com uma barra invertida ('\'); Já na sintaxe estendida (ERE), ela é invertida: esses caracteres são especiais, a menos que sejam prefixados com uma barra invertida ('\').

então, para GNU sed, use

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

paraPOSIX BRE, seu segundo comando é o caminho a percorrer

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

informação relacionada