Estoy aprendiendo scripting de shell y para eso estoy usando HackerRank. Hay una pregunta relacionada con sedel mismo sitio: comando 'Sed' # 1 :
Para cada línea en un archivo de entrada dado, transforme la primera aparición de la palabra 'the' con 'this'. La búsqueda y la transformación deben ser estrictamente sensibles a mayúsculas y minúsculas.
Primero de todo lo intenté
sed 's/the/this/'
pero en esa muestra el caso de prueba falló. Entonces intenté
sed 's/the /this /'
Y funcionó. Entonces, surge la pregunta ¿qué diferencia crearon los espacios en blanco? ¿Me estoy perdiendo de algo?
sed
whitespace
JHA
fuente
fuente

Respuestas:
La diferencia es si hay un espacio después
theen el texto de entrada.Por ejemplo:
Con una oración sin espacio , sin reemplazo:
Con una oración con un espacio , funciona como se esperaba:
Con una oración con otro carácter de espacio en blanco , no se producirá ningún reemplazo:
fuente
the( |$)podría estar más cerca de funcionar, si esa expresión regular extendida funciona. De todos modos, identifique lo que quiere decir "como una cadena" frente a la subcadena. En ambos casos es una subcadena de toda la línea, y sus casos de prueba son insuficientes para detectar los casos donde"the "falla. La respuesta de Kusalanada es significativamente mejor, recomendaría aceptarla.Es una forma barata y propensa a errores de hacer coincidir palabras .
Tenga en cuenta que
thecon un espacio después no coincide con la palabrathereby, por lo tanto, coincidir con un espacio despuéstheevita hacer coincidir esa cadena al comienzo de las palabras. Sin embargo, todavía no coincidebathe(si es seguido por un espacio), y lo hace no coincidetheal final de una línea.Para que la palabra coincida
thecorrectamente (o cualquier otra palabra), no debe usar espacios alrededor de la palabra, ya que eso evitaría que coincida al principio o al final de las líneas o si está flanqueada por cualquier otro carácter que no sea una palabra, como cualquier signo de puntuación o tabulación, por ejemplo.En su lugar, use un patrón de límite de palabra de ancho cero:
El
\<y\>coincide con los límites antes y después de la palabra, es decir, el espacio entre un carácter de palabra y un carácter que no es de palabra . Un carácter de palabra es generalmente cualquier coincidencia de caracteres[[:alnum:]_](o[A-Za-z0-9_]en la localización POSIX).Con GNU
sed, también puede usar\ben lugar de\<y\>:fuente
sed funciona con expresiones regulares. Al
sed 's/the /this /'usarlo, simplemente haga el espacio después detheparte del patrón coincidente.El uso
sed 's/the/this/'de reemplazar todas las apariciones dethelathisno importa si existe un espacio despuésthe.En el ejercicio HackerRank, el resultado es el mismo porque reemplazar el con esto es lógico ... reemplaza solo un pro-sustantivo que por defecto es seguido por el espacio (reglas gramaticales).
Puede ver la diferencia si intenta, por ejemplo, capitalizar
thela palabrathe theater:fuente
gtexto posterior al reemplazo, reemplaza solo la primera ocurrencia.