2010-07-28 33 views
15

cómo eliminar líneas de comentario (como # bal bla) y líneas vacías (líneas sin caracteres) del archivo con un comando sed?sed + eliminar "#" y líneas vacías con un comando sed

THX lidia

+0

He hecho una prueba. paxdiablo vs Chris Johnson. El archivo de prueba fue squid.conf. squid.conf tiene más de 1000 líneas de comentarios para 15 líneas de configuración. El método paxdiablo funcionó perfectamente. Incluso eliminó los comentarios después de una configuración en la misma línea. Los resultados son exactamente lo que esperas, si no es mejor. Ambos pulgares arriba! El método mejorado de Chris Johnson parecía eliminar cada línea con un #, independientemente de dónde # se colocara en la línea. Resultando en la eliminación de líneas que no deberían haber sido. Buen intento Chris. Un buen lema con el que me gusta vivir es "Si no está roto, no lo arregles". –

Respuesta

26

Si usted está preocupado acerca de cómo iniciar dos procesos sed en una tubería en lugar de uno, es probable que no debe ser, no es que ineficiente.

Sin embargo, si hace quieren un solo proceso, se pueden utilizar varios -e argumentos, algo así como:

sed -e 's/#.*$//' -e '/^$/d' inputFile 

En respuesta a tu comentario sobre qué que quieren un único proceso , que desea utilizar sed -i para la edición in situ, aún puede hacerlo de acuerdo con la siguiente transcripción:

pax> echo 'Line # with a comment' >qq 
pax> echo >>qq 
pax> echo '# Line with only a comment' >>qq 
pax> cat qq 
Line # with a comment 

# Line with only a comment 
pax> sed -i -e 's/#.*$//' -e '/^$/d' qq 
pax> cat qq 
Line 
pax> _ 

Observe cómo el archivo se modifica in situ incluso con dos opciones de -e. Puede ver que ambos comandos se ejecutan en cada línea. La línea con un comentario primero tiene el comentario eliminado y luego todo se elimina porque está vacío.

Además, también se elimina la línea vacía original.

+0

pero si quiero usar el sed -i (cómo integrarlo) – lidia

+0

Eso sigue funcionando bien, vea la actualización. – paxdiablo

+4

Múltiples argumentos '-e' no son necesarios. Una vez puede agregar un ';' para preformar acciones múltiples. es decir 'sed '/^[#;].*$/ d;/^ $/d'' –

3

variante alternativa, usando grep:


cat file.txt | grep -Ev '(#.*$)|(^$)' 
+0

pero si el "#" no está en la petición del archivo? (pero la línea comienza con "#") – lidia

+0

cat file.txt | grep -Ev '(^ #. * $) | (^ $)' para eliminar líneas que comienzan con "#" – demetrios

+0

Esto es muy intuitivo en términos de preservación del archivo original. –

1

puede usar awk

awk 'NF{gsub(/^[ \t]*#/,"");print}' file 
10

@paxdiablo tiene una buena respuesta, pero puede ser mejorado.

(1) La cláusula '/^$/d' solo coincide con líneas en blanco al 100%.

Si desea también que coincida con las líneas que están completamente en blanco (espacios, tabulaciones, etc.) utilizan este lugar:

'/^\s*$/d' 

(2) La cláusula 's/#.*$//' sólo coincide con las líneas que comienzan con el carácter # en la columna 0.

Si desea también que coincida con las líneas que tienen un solo espacio en blanco antes del primer uso # esto en su lugar:

'/\s*#.*$/d' 

Los criterios anteriores pueden no ser universales (p. dentro de un bloque HEREDOC, o en una cadena multilínea Python los diferentes enfoques podrían ser significativos), pero en muchos casos la definición convencional de líneas "en blanco" incluye espacios en blanco solamente, y las líneas "comentarios" incluyen espacios en blanco-entonces-#.

(3) Por último, al menos en OSX, la solución @paxdiablo en la que la primera cláusula transforma líneas de comentario en líneas en blanco, y la segunda cláusula elimina líneas en blanco (incluidos los comentarios originales) no funciona. Parece ser más portátil hacer que las dos cláusulas /d eliminen las acciones como lo hice.

El comando revisado que incorpora lo anterior es:

sed -e '/\s*#.*$/d' -e '/^\s*$/d' inputFile 
+0

¿Hay alguna manera de combinar los dos en un solo patrón? Intenté muchas combinaciones, pero no funciona. Entonces quiero saber si hay una manera, y si no, ¿por qué? ¡Gracias! – bruin

0

On (uno de) mi cajas de Linux, sed comprenda a las expresiones regulares extendidas con la opción -r, por lo que:

-r sed '/ (^ \ s * #) | (^ \ s * $)/d 'squid.conf.installed

es muy útil para mostrar todas las líneas que no están en blanco, que no son de comentarios. La expresión regular coincide con el inicio de la línea seguido de cero o más espacios o pestañas seguidas por un algoritmo hash o al final de la línea, y elimina esas líneas coincidentes de la entrada.

0

El primer ejemplo (paxdiablo) es muy bueno, excepto que no es un archivo de cambio, solo el resultado de salida. Si desea cambiarlo en línea:

sudo sed -i 's /#.*$//;/^$/ d' ArchivoDeEntrada

0

Esta pequeña joya elimina todos # comentarios, sin materia en el que comienzan en una línea:

sed -e 's/\s*#.*$//' 

Ejemplo:

text=" 
this is a # test 
#this is a test 
#this is a #test 
this is # another #test 
" 

$echo "$text" | sed -e 's/\s*#.*$//' 

this is a 


this is 

Siguiente esto elimina las líneas en blanco resultantes:

$echo "$text" | sed -e 's/\s*#.*$//' | sed -e '/^\s*$/d' 
Cuestiones relacionadas