¿Qué diferencia hace coincidir una palabra con / sin un espacio en blanco al final?

12

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?

JHA
fuente
Supongo que la primera versión también "funcionó", pero no como esperaba. Debería haber reemplazado la primera aparición de la secuencia de letras "the", pero probablemente haya visto la primera aparición de la palabra "the".
Dubu
Bueno, en esta historia, sí, en la práctica, no.
Rolf

Respuestas:

7

La diferencia es si hay un espacio después theen el texto de entrada.
Por ejemplo:

Con una oración sin espacio , sin reemplazo:

$ echo 'theman' | sed 's/the /this /'
theman

Con una oración con un espacio , funciona como se esperaba:

$ echo 'the man' | sed 's/the /this /'
this man

Con una oración con otro carácter de espacio en blanco , no se producirá ningún reemplazo:

$ echo -e 'the\tman' | sed 's/the /this /'
the     man
BDR
fuente
Me lo perdí. Tuve que tomar "el" como una cuerda. No es una subcadena.
JAI
1
@JHA: También importa al final de una línea. por ejemplo, la palabra "the" podría aparecer al final de una línea como parte de un archivo con ajuste de línea, pero aún estar en el medio de un párrafo y, por lo tanto, seguir siendo una palabra normal en una oración en inglés. 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.
Peter Cordes
20

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 palabra thereby, por lo tanto, coincidir con un espacio después theevita hacer coincidir esa cadena al comienzo de las palabras. Sin embargo, todavía no coincide bathe(si es seguido por un espacio), y lo hace no coincide theal 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:

sed 's/\<the\>/this/'

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 \>:

sed 's/\bthe\b/this/'
Kusalananda
fuente
7

sed funciona con expresiones regulares. Al sed 's/the /this /'usarlo, simplemente haga el espacio después de theparte del patrón coincidente.

El uso sed 's/the/this/'de reemplazar todas las apariciones de thela thisno importa si existe un espacio después the.

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 palabra the theater:

echo 'the theater' |sed 's/the /THE /g'
THE theater                              
#theater is ignored since the is not followed by space

echo 'the theater' |sed 's/the/THE/g'
THE THEater
#both the are capitalized.
George Vasiliou
fuente
Gracias por la respuesta. Apreciado :)
JHA
"reemplaza todas las ocurrencias" Para ser claros: sin el gtexto posterior al reemplazo, reemplaza solo la primera ocurrencia.
Dubu