2009-10-20 19 views
8

Fichero 1:usar sed para eliminar todos los siguientes espacios iniciales/blanco en un archivo de texto

hello 
    world 

¿Cómo se podría eliminar los espacios en blanco que conduce/arrastran dentro de este archivo usando sed - usando un comando (no hay archivos intermedios)?

he actualmente tiene:

sed -e 's/^[ \t]*//' a > b 

Para los espacios iniciales.

sed 's/ *$//' b > c 

Y esto para espacios al final.

+0

Si bien la respuesta de @ ghostdog74 es buena, la respuesta de @mouviciel es la * correcta *, según su pregunta. Subí ambos, pero creo que @mouviciel merece ser aceptado como la respuesta correcta. –

+0

Tiene la razón: ahora se acepta mouviciel. ¡Gracias tanto a mouviciel (respuesta correcta) como a ghostdog74 (instrucciones para awk) por su tiempo! – user191960

Respuesta

10

Casi lo consiguió:

sed -e 's/^[ \t]*//;s/[ \t]*$//' a > c 

Además en algunos sabores de sed, también hay una opción para la línea de edición:

sed -i -e 's/^[ \t]*//;s/[ \t]*$//' a 
+3

También consideraría emparejar '\ s' que es el genérico 'todos los caracteres de espacio en blanco'. –

+0

¿No debería ser 'sed -e 's/^ [\ t] * //; s/[\ t] * $ //' a> c'? –

+0

Todavía veo 'sed-e 's/^ [\ t] * //; s/[\ t] * $ /' a> c' que no funciona para mí (versión bash 4.3.30, Funtoo-Linux) –

7

manera más fácil, usando awk

awk '{$1=$1}1' file 

o

awk '{gsub(/^ +| +$/,"")}1' file 
+0

El primero funcionó a la perfección y es el más simple: sé que no es lo que pregunté (es decir, sed), pero es tan elegante :). Voy a mirar a awk ahora. – user191960

+0

El primero elimina todos los espacios en blanco espurios, no solo de inicio y final.El segundo funciona mejor 'awk' es una gran herramienta. – mouviciel

+0

Ah, veo los otros espacios eliminados con el primero ahora; el segundo funciona sin eliminaciones adicionales. – user191960

3
perl -lape 's/^\s+|\s+$//g' 

Honestamente, sé Perl expresiones regulares de la mejor, así que encontrar perl -lape mucho más fácil de usar que sed -e.

Además, para responder a la pregunta original, puede haber sed ejecutar múltiples operaciones como esta:

sed -e 's/something/something else/' -e 's/another substitution/another replacement/' 

Al parecer, también puede poner los dos sustituciones en una secuencia y separarlos con un punto y coma, como se indica en otra respuesta

0

Tenga en cuenta que en el caso más general de la aplicación de varios filtros en una fila para un archivo de entrada sin usar archivos intermedios, la solución es utilizar tuberías:

sed -e 's/^[ \t]*//' a | sed -e 's/ *$//' > c 

Es obvio que no se requieren aquí porque una invocación de sed es suficiente, pero si el segundo comando de sed fue algo diferente, como uniq u ordenar, entonces este patrón es el correcto.

Cuestiones relacionadas