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
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
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.
variante alternativa, usando grep:
cat file.txt | grep -Ev '(#.*$)|(^$)'
puede usar awk
awk 'NF{gsub(/^[ \t]*#/,"");print}' file
@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
¿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
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.
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
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'
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". –