Por que você está escapando do H e do W?
\H
e \W
têm significados específicos e são diferentes de H
e W
.
echo " WHERE x=10" |sed 's/ *WHERE \+/WHERE /g'
Isso funciona
echo " HELLO x=10" |sed 's/ *\HELLO \+/HELLO /g'
remove o espaço contínuo antes de hello e depois da palavra "HELLO"
mas isso não acontece
echo " WHERE x=10" |sed 's/ *\WHERE \+/WHERE /g'
Eu tentei escapar \ w com \ w como abaixo
echo " WHERE x=10" |sed 's/ *\"WHERE" \+/\"WHERE" /g'
mas mesmo isso não está funcionando. O que está errado?
Por que você está escapando do H e do W?
\H
e \W
têm significados específicos e são diferentes de H
e W
.
echo " WHERE x=10" |sed 's/ *WHERE \+/WHERE /g'
Basta soltar o \
antes das palavras.
echo " WHERE x=10" |sed 's/ *WHERE \+/WHERE /g'
WHERE x=10
O \
em expressões regulares é usado como um caractere de escape para vários tipos de correspondências.
O \w
é usado para localizar um caractere de palavra, ou seja, um caractere de a-z
, A-Z
, 0-9
, incluindo o caractere _
(sublinhado).
Como uma versão maiúscula nega uma correspondência, seu \W
significa que não corresponde a um único caractere, o que obviamente faz a regex falhar para sua string de entrada.
Tente por exemplo:
echo " {HERE x=10" |sed 's/ *\WHERE \+/WHERE /g'
WHERE x=10
funciona porque {
é correspondido por \W
(como {
NÃO é um caractere de palavra)!