Estou aprendendo scripts de shell e por isso estou usando o HackerRank. Há uma pergunta relacionada ao sed
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 transformação devem ser estritamente sensíveis a maiúsculas e minúsculas.
Primeiro de tudo eu 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 questão de que diferença os espaços em branco criaram? Estou faltando alguma coisa aqui?
sed
whitespace
JAI
fonte
fonte
Respostas:
A diferença é se existe um espaço depois
the
no texto de entrada.Por exemplo:
Com uma frase sem espaço , não há substituição:
Com uma frase com um espaço , funciona conforme o esperado:
Com uma frase com outro caractere de espaço em branco , nenhuma substituição ocorrerá:
fonte
the( |$)
pode estar mais perto de funcionar, se esse regex estendido funcionar. Enfim, identifique o que você quer dizer "como uma string" versus substring. Nos dois casos, é uma substring de toda a linha, e seus casos de teste são insuficientes para detectar os casos em que"the "
falha. A resposta de Kusalanada é significativamente melhor, eu recomendo aceitá-la.É uma maneira barata e propensa a erros de correspondência de palavras .
Observe que,
the
com um espaço após ele não corresponde à palavrathereby
, a correspondência com um espaço apósthe
evita a correspondência dessa sequência no início das palavras. No entanto, ainda não coincidir combathe
(se for seguido por um espaço), e ele não corresponderthe
, no 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 a correspondência no início ou no final das linhas ou se for flanqueada por outro caractere que não seja uma palavra, como qualquer pontuação ou caractere de tabulação, por exemplo.Em vez disso, use um padrão de limite de palavra com 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 é uma palavra . Um caractere de palavra geralmente corresponde a qualquer caractere[[:alnum:]_]
(ou[A-Za-z0-9_]
no código do idioma POSIX).Com o GNU
sed
, você também pode usar\b
no lugar de\<
e\>
:fonte
sed trabalha com expressões regulares. Se
sed 's/the /this /'
você usar apenas faça o espaço apósthe
parte do padrão correspondente.Usando
sed 's/the/this/'
você substituir todas as ocorrênciasthe
comthis
não importa se existe um espaço depoisthe
.No exercício HackerRank, o resultado é o mesmo, porque substituir o com isso é lógico ... você substitui apenas um pró-substantivo que, por padrão, é seguido pelo espaço (regras gramaticais).
Você pode ver a diferença se tentar, por exemplo, capitalizar
the
na palavrathe theater
:fonte
g
texto após a substituição, você substitui apenas a primeira ocorrência.