Reemplace todas las ocurrencias de dos espacios después del final de una oración con solo un espacio

9

Estoy atrapado en incluir expresiones regulares con un comando sed.

P: Quiero reemplazar todas las ocurrencias de dos espacios después del final de una oración con solo una vez espacio.

Aquí esta lo que hice:

sed 's/^ $/^$/' file  

Y no sustituyó dos espacios con un espacio una vez que termina la oración.

Salida que obtengo:

This is the output.  Hello Hello

Salida que quiero:

This is the output. Hello Hello
Zeus
fuente
@Rahul Quiero que la salida contenga una vez el espacio después de que termine la oración. No dos espacios como en la primera oración. Quiero la salida de la segunda oración
Zeus
La respuesta de @Jasen es correcta. Por cierto, el comando que probó significa: Sustituir una línea que consta de un solo espacio en blanco por una línea vacía. Es por eso que no hizo lo que querías.
rexkogitans
1
Insertar aquí: guerra en espacio simple versus doble después de punto final
gerrit
@gerrit Esa guerra se perdió hace unos 20 años. ;)
h4ckNinja

Respuestas:

12
 sed 's/\.   */. /g' < file

reemplace el punto seguido de dos o más espacios con punto seguido de un solo espacio.

Jasen
fuente
Su comando realmente funciona para todo el párrafo. Eso es exactamente lo que quería. ¡Gracias!
Zeus
o sed -r 's/\.\s+/. /g' filecon GNU sed ...
Sundeep
@spasic use en sed -Elugar de sed -r. Eso funciona con GNU sed y * BSD sed (incluido Mac OS X) y algunos otros. Está programado para su inclusión como estándar en POSIX "muy pronto ahora".
cas
@cas Recuerdo que en algún momento atrás, le sugerí sed -Ea alguien en este sitio que no funcionó pero sed -rfuncionó ... He trabajado con GNU sed solo, así que no tengo idea sobre POSIX y otras variaciones ... trataré de incluir este detalle en el futuro , gracias :)
Sundeep
Debe haber sido una versión antigua de GNU sed. Han respaldado -Edurante bastante tiempo (desde al menos 2011, pero las páginas de manual e información solo mencionan -r)
cas
13

Tu sedcomando 's/^ $/^$/'no hará lo que quieras. Simplemente reemplaza todas las líneas que contienen un espacio con una línea que contiene ^$.

Depende de qué caracteres marcan el final de la oración, puede hacer:

sed -e 's/\([.?!]\) \{2,\}/\1 /g' <file

Esto reemplazará 2 o más espacios después ., ?o !con un solo espacio.

Cuonglm
fuente
1
se puede acortar ased -r 's/([.?!])\s+/\1 /g' file
Sundeep
Gracias. Pero, ¿podría explicar amablemente por qué tantos corchetes redondos y cuadrados utilizó? Es un poco confuso.
Zeus
1
@spasic: Eso solo funciona con GNU sed, actualizado con una versión simplificada.
Cuonglm
@ Zeus: Esa es la sintaxis estándar con BRE predeterminado.
Cuonglm
1
No, el sedscript de edición original reemplazará cualquier línea que contenga un solo espacio con la cadena literal ^$.
Kusalananda
7

Esto es lo que podrías estar buscando,

tr -s " " <filename

Muestra,

$ echo "This is the output.  Hello Hello" | tr -s "[:blank:]"
This is the output. Hello Hello

Utilizando sed,

$ echo "This is the output.  Hello Hello" | sed 's/\. \+/. /g'
$ echo "This is the output.  Hello Hello" | sed 's/\. \{1,\}/. /g'
This is the output. Hello Hello
Rahul
fuente
2
Bueno, está funcionando gracias, pero necesito incluir el comando sed. Indique algo similar a lo que se muestra arriba, como sustitución, cambio de texto, etc. en sed.
Zeus
2
No estaba al tanto de esta función tr,
Jasen
3
Este enfoque reemplazará dos espacios que no son el final de la oración, también.
Cuonglm