Pregunta ¿Cómo hacer coincidir el espacio en blanco en sed?


¿Cómo puedo unir espacio en blanco en sed? En mis datos, deseo hacer coincidir los 3 o más caracteres de espacio en blanco (espacio tabulado) y reemplazarlos por 2 espacios. ¿Cómo puede hacerse esto?


185


origen




Respuestas:


La clase de personaje \s coincidirá con los caracteres de espacio en blanco <tab> y <space>.

Por ejemplo:

$ sed -e "s/\s\{3,\}/  /g" inputFile

sustituirá cada secuencia de al menos 3 espacios en blanco con dos espacios.


OBSERVACIÓN: Para el cumplimiento de POSIX, use la clase de caracteres [[:space:]] en lugar de \s, ya que este último es una extensión de GNU sed. Ver las especificaciones POSIX para sed y BREs


192



aha! Fue el interruptor -e que faltaba lo que me atrapó. - sequoia mcdowell
También tuve que agregar el modificador '-r' que permite expresiones regulares extendidas para hacer que sed reconozca '\ s' como espacio. - HUB
Con Apple sed Tuve que usar [[:space:]] porque \s no funcionó para mí Quizás \s es un GNU sed ¿extensión? - Jared Beck
@JaredBeck gracias, se estaba quedando sin ideas de por qué mi expresión regular simple no funcionaba. Esto es cojo, pensé que era una expresión regular extendida estándar. También -no funciona y -E hizo sentadillas - Karthik T
Gracias por la respuesta. Actualicé la respuesta con enlaces al estándar POSIX. - mrucci


Esto funciona en MacOS 10.8:

sed -E "s/[[:space:]]+/ /g"

55



¿Sabes si esto funciona en todas las distribuciones de Linux? - amphibient
En general, GNU sed no tendrá -E. Desde la página BSD sed man: "Las opciones -E, -a y -i son extensiones de FreeBSD no estándar y pueden no estar disponibles en otros sistemas operativos". - Brad Koch
¿Por qué necesita el indicador -E para el operador +? La mayoría de las expresiones probablemente estarían bien con * en su lugar, entonces esto funcionaría en otras plataformas. - Samuel
@Samuel Si usa *, la expresión regular coincidirá con cero o más espacios, y obtendrá un espacio entre cada carácter y un espacio en cada extremo de cada línea. Si no tienes el indicador -E, entonces quieres sed "s/[[:space:]]\+/ /g" para unir uno o más espacios. - jbo5112
FWIW, sed de NetBSD admite el -E bandera también. - mcandre


Algunas versiones anteriores de sed pueden no reconocerse como un token de coincidencia de espacio en blanco. En ese caso, puede hacer coincidir una secuencia de uno o más espacios y pestañas con '[XZ] [XZ] *', donde X es un espacio y Z es una pestaña.


13



Entonces, para la necesidad particular aquí, con un sed más antiguo, podría hacer: $ sed 's / [XZ] [XZ] [XZ] [XZ] * / / g' inputfile donde X es una pestaña y Z es un espacio. - Marnix A. van Ammers


sed 's/[ \t]*/"space or tab"/'

8



¿Esto está garantizado para trabajar en cualquier versión de sed en cualquier sistema? Si no, vale la pena mencionar dónde funciona esto de una manera similar a las otras respuestas, solo para que sepamos las limitaciones y donde esto podría no tener el resultado esperado. - Mokubai♦
Este RE es lo que uso para unir espacios en blanco. Es más simple que las clases de caracteres solo para hacer coincidir pestaña o espacio. Utiliza solo las convenciones más básicas de expresiones regulares, por lo que debería funcionar en cualquier lugar con una implementación funcional de expresiones regulares. - Nate
En Mac 10.9.5, esto coincide con espacios y 't'. Usé el anterior de Michael Douma para que coincida con los caracteres en blanco (también funciona con -e). - Alien Life Form
No funciona sensatamente en mi sistema SUSE. Coincide con el primer lugar en la línea donde hay cero o más espacios, que es anterior al primer carácter. Dudo que esa sea la función prevista, y ciertamente no fue el caso de uso solicitado. Creo que quieres cambiar el '*' por '\ +' (o '\ {3, \}' según la pregunta) y tal vez poner un g al final del comando sed para unir todas las ocurrencias del patrón. Reemplazar [\ t] con [[: espacio:]] también puede ser deseable, en caso de que exista algo más en el espacio en blanco de la línea. - jbo5112