o que há de errado com sed ao usar palavras que começam com “w”

0

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 etl_devs 10.10.2018 / 16:50

2 respostas

3

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'
    
por 10.10.2018 / 16:59
2

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)!

    
por 10.10.2018 / 17:03