br sed - como usar o limite da palavra \ b corretamente?

4

Eu quero substituir citações que estão no início de uma palavra.

Por exemplo:

$ echo "a 'line' a single ' after a  'keyword' with a few space's for a program"\
| sed "s/\b'/X/g"
a 'lineX a single ' after a  'keywordX with a few spaceXs for a program

mas, como você pode ver, eles estão sendo substituídos no fim de palavras, não no começo.
Como substituir os que iniciam uma palavra?

    
por Michael Durrant 20.09.2015 / 03:54

1 resposta

7

Isso substitui ' no início das palavras:

$ echo "a 'line' a single ' after a  'keyword' with a few space's for a program"| sed "s/'\b/X/g"
a Xline' a single ' after a  Xkeyword' with a few spaceXs for a program

Para humanos, não para computadores, há uma peculiaridade aqui: o computador conta space's como duas palavras e substitui o ' porque está no início da segunda palavra.

Discussão

\b marca um limite de palavra, seja começo ou fim. Agora considere \b' . Isso corresponde a um limite de palavra seguido por um ' . Como ' não é um caractere de palavra, isso significa que o final da palavra deve preceder o ' para corresponder. Para usar \b para corresponder ao início das palavras, inverta a ordem: '\b . Novamente, como ' não é um caractere de palavra, isso só será igual se uma palavra seguir o ' .

Alguns seds, como o GNU sed, suportam \< para corresponder ao início das palavras. Isso não ajuda no seu caso porque ' já não é um caractere de palavra e isso força o problema.

O que fazer com "espaço"

Se você não quiser que ' seja substituído em space's porque o ' aparece no final de uma palavra, você pode inverter a lógica usando \B :

$ echo "a 'line' a single ' after a  'keyword' with a few space's for a program"| sed "s/\B'/X/g"
a Xline' a single X after a  Xkeyword' with a few space's for a program

\B corresponde a não um limite de palavras . Assim, \B' corresponde a ' (espaço-citação) porque nem espaço nem citação são caracteres de palavras. Ele não corresponde a space' porque e' é um limite de palavra: e é um caractere de palavra e ' não é.

    
por 20.09.2015 / 04:22

Tags