sustituir - sed+eliminar "#" y líneas vacías con un comando sed
sed eliminar lineas (7)
@paxdiablo tiene una buena respuesta pero puede mejorarse.
(1) La cláusula ''/^$/d''
solo coincide con el 100% de las líneas en blanco.
Si también quiere hacer coincidir líneas que son espacios en blanco (espacios, tabulaciones, etc.), use esto en su lugar:
''/^/s*$/d''
(2) La cláusula ''s/#.*$//''
solo coincide con las líneas que comienzan con el carácter #
en la columna 0.
Si también quiere hacer coincidir las líneas que solo tienen espacios en blanco antes del primer #
use esto en su lugar:
''/^/s*#.*$/d''
Los criterios anteriores pueden no ser universales (por ejemplo, dentro de un bloque HEREDOC o en una cadena multilínea de Python, los diferentes enfoques podrían ser significativos), pero en muchos casos la definición convencional de líneas "en blanco" incluye solo espacios en blanco, y "comentario "las líneas incluyen espacios en blanco-entonces- #
.
(3) Por último, al menos en OSX, la solución @paxdiablo en la que la primera cláusula convierte las líneas de comentarios en líneas en blanco, y la segunda cláusula elimina las líneas en blanco (incluidos los comentarios originales) no funciona. Parece ser más portátil hacer que ambas cláusulas /d
borren las acciones como lo he hecho.
El comando revisado que incorpora lo anterior es:
sed -e ''/^/s*#.*$/d'' -e ''/^/s*$/d'' inputFile
¿Cómo eliminar líneas de comentarios (como # bal bla) y líneas vacías (líneas sin caracteres) del archivo con un comando sed?
THX lidia
El primer ejemplo (paxdiablo) es muy bueno, excepto que no se modifica el archivo, solo se obtiene el resultado. Si quieres cambiarlo en línea:
sudo sed -i ''s /#.*$//;/^$/ d'' inputFile
En (una de) mis cajas de Linux, sed entiende expresiones regulares extendidas con la opción -r, así que:
sed -r ''/ (^ / s * #) | (^ / s * $) / d'' squid.conf.installed
Es muy útil para mostrar todas las líneas sin comentarios, sin espacios en blanco. La expresión regular coincide con el inicio de línea seguido de cero o más espacios o tabulaciones seguidas de un hash o final de línea, y elimina las líneas coincidentes de la entrada.
Esta pequeña joya elimina todos los # comentarios, sin importar dónde empiecen 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
A continuación, esto elimina cualquier línea en blanco resultante:
$echo "$text" | sed -e ''s//s*#.*$//'' | sed -e ''/^/s*$/d''
Variante alternativa, utilizando grep:
cat file.txt | grep -Ev ''(#.*$)|(^$)''
puedes usar awk
awk ''NF{gsub(/^[ /t]*#/,"");print}'' file
Si le preocupa iniciar dos procesos sed
en una tubería en lugar de uno, probablemente no debería serlo, no es tan ineficiente.
Sin embargo, si desea un solo proceso, puede usar varios argumentos -e
, algo como:
sed -e ''s/#.*$//'' -e ''/^$/d'' inputFile
En respuesta a su comentario sobre por qué quiere un solo proceso, queriendo usar sed -i
para la edición en contexto, 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 se modifica el archivo en el lugar incluso con dos opciones -e
. Puedes ver que ambos comandos se ejecutan en cada línea. La línea con un comentario primero tiene el comentario eliminado, luego todo se elimina porque está vacío.
Además, la línea vacía original también se elimina.