Estoy aprendiendo scripting de shell y para eso estoy usando HackerRank. Hay una pregunta relacionada con sed
el 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
the
en 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
the
con un espacio después no coincide con la palabrathereby
, por lo tanto, coincidir con un espacio despuésthe
evita 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 coincidethe
al final de una línea.Para que la palabra coincida
the
correctamente (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\b
en lugar de\<
y\>
:fuente
sed funciona con expresiones regulares. Al
sed 's/the /this /'
usarlo, simplemente haga el espacio después dethe
parte del patrón coincidente.El uso
sed 's/the/this/'
de reemplazar todas las apariciones dethe
lathis
no 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
the
la palabrathe theater
:fuente
g
texto posterior al reemplazo, reemplaza solo la primera ocurrencia.