Estou aprendendo shell-scripting e para isso estou usando o HackerRank. Há uma pergunta relacionada sed
no mesmo site: Comando 'Sed' #1 :
Para cada linha em um determinado arquivo de entrada, transforme a primeira ocorrência da palavra 'the' com 'this'. A pesquisa e a transformação devem ser estritamente sensíveis a maiúsculas e minúsculas.
Primeiro tentei,
sed 's/the/this/'
mas nesse caso de teste de amostra falhou. Então eu tentei
sed 's/the /this /'
e funcionou. Então, surge a pergunta que diferença os espaços em branco criaram? Estou faltando alguma coisa aqui?
É uma maneira barata e propensa a erros de fazer correspondência de palavras .
Observe que
the
com um espaço após ele não corresponde à palavrathereby
, portanto, a correspondência com um espaço apósthe
evita a correspondência dessa string no início das palavras. No entanto, ainda corresponde (bathe
se seguido por um espaço) e não correspondethe
ao final de uma linha.Para corresponder a palavra
the
corretamente (ou qualquer outra palavra), você não deve usar espaços ao redor da palavra, pois isso impediria que você a correspondesse no início ou no final das linhas ou se estiver flanqueada por qualquer outro caractere que não seja de palavra, como qualquer pontuação ou caractere de tabulação, por exemplo.Em vez disso, use um padrão de limite de palavra de largura zero:
O
\<
e\>
corresponde aos limites antes e depois da palavra, ou seja, o espaço entre um caractere de palavra e um caractere que não é de palavra . Um caractere de palavra geralmente é qualquer correspondência de caracteres[[:alnum:]_]
(ou[A-Za-z0-9_]
na localidade POSIX).Com GNU
sed
, você também pode usar\b
no lugar de\<
e\>
:A diferença é se há um espaço depois
the
no texto de entrada.Por exemplo:
Com uma frase sem espaço , sem substituição:
Com uma frase com um espaço , funciona como esperado:
Com uma frase com outro caractere de espaço em branco , nenhuma substituição ocorrerá:
sed funciona com expressões regulares. Usando
sed 's/the /this /'
você apenas faça o espaço apósthe
parte do padrão combinado.Usando
sed 's/the/this/'
você substitui todas as ocorrências dethe
porthis
não importa se existe um espaço apósthe
.No exercício HackerRank, o resultado é o mesmo porque substituir o por isso é lógico... você substitui apenas um pró-nome que por padrão é seguido por espaço (regras gramaticais).
Você pode ver a diferença se tentar, por exemplo, capitalizar
the
a palavrathe theater
: