
Eu tenho uma string semelhante ../../sdd1
e tentando combinar sdd
a partir daqui. Estou tentando usar o seguinte sed
comando:
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 1
from sdd1
ou por que temos que escapar do ?
e das chaves?
Responder1
Por padrão, sed
usa BRE e seria necessário -E
ou -r
opçã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