Eu tenho uma string e preciso adicionar #
, no começo, ou seja, converter [ -n "$ID" -a "$ID" -le 200 ] && return
para #[ -n "$ID" -a "$ID" -le 200 ] && return
. Eu posso usar o comando abaixo:
echo '[ -n "$ID" -a "$ID" -le 200 ] && return'| sed -n -e 's/\[ -n "$ID" -a "$ID" -le 200 \] && return/#&/p'
Funciona. Agora eu tenho duas perguntas, em relação ao E
, flag.
Para a string
[ -n "$ID" -a "$ID" -le 200 ]
, se eu escapar de colchetes, não funciona; no entanto, funciona quando eu não escapo deles, ou sejased -n -E 's/[ -n "$ID" -a "$ID" -le 200 ]/#&/p'
funciona enquanto
sed -n -E 's/\[ -n "$ID" -a "$ID" -le 200 \]/#&/p'
não funciona.
Pois, a string completa
[ -n "$ID" -a "$ID" -le 200 ] && return
, me dá uma resposta errada, quando não escapo deles:echo '[ -n "$ID" -a "$ID" -le 200 ] && return'| sed -n -E 's/[ -n "$ID" -a "$ID" -le 200 ] && return/#&/p'
Ele me dá saída:
[ -n "$ID" -a "$ID" -le 200 #] && return
Eu quero saber como está funcionando.
Não funciona do jeito que você espera que funcione, é mais uma coincidência:
[...]
é uma coleção de caracteres que combinam. Dentro dessa coleção, você tem um intervalo-n
de espaço em branco (0x20) an
(0x6E), que pode incluir[
(0x5B), dependendo de suas configurações de localidade. Portanto, a coleção corresponde ao primeiro caractere. Veja o que acontece quando você toma#&___
como substituto... não é sua intenção, eu acho?E essa é a razão para o seu caso completo falhar: o caractere correspondente para a coleção é o
]
porque é seguido pelo resto do padrão, é por isso que o#
é inserido lá.O problema com a expressão regular estendida é como @steeldriver assumido: As
$
âncoras do padrão:Portanto, no ERE, um literal
$
precisa ser escapado, enquanto no BRE ele só precisa ser escapado quando for o último caractere do padrão.Observe também que
-e
marca o próximo argumento como um script e é opcional se houver apenas um script, enquanto-E
é um switch. Soltar-e
para '-E' só funciona se houver apenas um script porque era supérfluo de qualquer maneira.