Tengo un archivo con comentarios:
foo
bar
stuff
#Do not show this...
morestuff
evenmorestuff#Or this
Solo quiero imprimir todo el código no comentado:
foo
bar
stuff
morestuff
evenmorestuff
Poder quitar los comentarios de un archivo es muy importante ... ¿Cuál es una buena manera de hacerlo?
shell-script
text-processing
awk
sed
grep
Questionmark
fuente
fuente
awk -F\# '$1!="" { print $1 ;} '
.echo '#' # output a #
manejaría una línea como ?Respuestas:
Una forma de eliminar todos los comentarios es usar
grep
con la-o
opción:dónde
-o
: imprime solo una parte coincidente de la línea^
: comienzo de la línea[^#]*
: cualquier carácter excepto#
cero repetido o más vecesTenga en cuenta que las líneas vacías también se eliminarán, pero las líneas con solo espacios permanecerán.
fuente
grep -v '^#' file > newfilewithoutcomments
somvar='I am a long complicated string ## with special characters' # and I am a comment
no se manejará correctamente.grep -o '^[^#].*' file
sed
la solución solo tiene una línea en blanco, parece un argumento sólido para usar otra respuesta, a menos que me falte algo?grep
quizás? Intente cambiargrep
acommand grep
, si aún ve espacios, publique la entrada de muestra.Creo que
sed
puede hacer un trabajo mucho mejor de esto quegrep
. Algo como esto:Explicación
sed
verá por defecto su archivo línea por línea e imprimirá cada línea después de aplicar posiblemente las transformaciones en las comillas. (sed '' your_file
solo imprimirá todas las líneas sin cambios).sed
dos comandos para ejecutar en cada línea (están separados por un punto y coma)./^[[:blank:]]*#/d
. En inglés, eso significa que si la línea coincide con un hash al principio (precedido por cualquier número de espacios en blanco iniciales), elimine esa línea (no se imprimirá).s/#.*//
. En inglés, es decir, sustituya una marca de hash seguida de tantas cosas como pueda encontrar (hasta el final de la línea, eso es) con nada (nada es el espacio vacío entre las dos últimas//
).fuente
mystring="Hello I am a #hash"
se convertirá enmystring="Hello I am a"
crontab
solo permiten comentarios de línea completa, con o sin espacios en blanco iniciales, pero no permiten comentarios finales en una línea. La lógica es MUCHO más simple. Use solo la primera de las dos instrucciones Sed en esta respuesta para un separador de comentarios crontab.)#
(en la columna 1), ¿Hay algún beneficio parased
másgrep -v "^#"
?Puede lograr el resultado requerido utilizando el comando sed. El siguiente comando había hecho el truco para mí.
Dónde
#.*$
- Regexp filtrará toda la cadena que comienza#
hasta el final de la líneaAquí necesitamos eliminar esas líneas, por lo que las reemplazamos por vacías, así que omitimos la parte de 'reemplazo'.
g
- mencionando la búsqueda repetida del patrón hasta llegar al final del archivo.Sintaxis general de sed:
s/regexp/replacement/flags FileName
fuente
sed
comando ...print "#tag" # Print a hashtag.
Como otros han señalado, sed y otras herramientas basadas en texto no funcionarán bien si alguna parte de un script parece un comentario pero en realidad no lo es. Por ejemplo, podría encontrar un # dentro de una cadena, o el bastante común
$#
y${#param}
.Escribí un formateador de shell llamado shfmt , que tiene una función para minificar el código. Eso incluye eliminar comentarios, entre otras cosas:
El analizador y la impresora son paquetes Go, por lo que si desea una solución personalizada, debería ser bastante fácil escribir un programa Go de 20 líneas para eliminar los comentarios de la manera exacta que desee.
fuente
Puede usar la combinación invertida de esta manera:
-v, --invert-match Invierte el sentido de coincidencia, para seleccionar líneas no coincidentes. (-v es especificado por POSIX).
fuente
evenmorestuff
en el ejemplo del OP.grep -o '^[^#]*' file
sería la mejor solución. esto ya lo explica jimmij. gracias por tu comentarioprint "#tag" # Print a hashtag.
Me gusta la respuesta de Joseph, pero también la necesitaba para quitar // comentarios, así que la modifiqué un poco y probé en redhat
Apuesto a que hay una mejor manera de eliminar líneas en blanco que usar cadenas, pero fue la solución rápida y sucia que utilicé.
-salud
fuente
print "#tag" # Print a hashtag.
Esto funciono para mi
fuente
print "#tag" # Print a hashtag.
Se utiliza
#
como separador de columnas y mantiene solo la primera columna (eso es todo antes#
).fuente
YOUR_FILE
es un script que contiene esos comandos, el script se dejaríacat YOUR_FILE | cut -'
en el archivo en esa línea.Usa expresiones como
: -v: hará una inversión invertida
: #: coincidirá con todas las líneas que comienzan con #
: $ ^: coincidirá con todas las líneas en blanco
fuente
#
coincidirá en cualquier lugar de la línea y eliminará toda la línea.La mejor solución sería usar el comando:
sed -i.$(date +%F) '/^#/d;/^$/d' ntp.conf
El -i es la edición in situ, pero el prefijo que sigue directamente le dice a sed que cree una copia de seguridad. En este caso con una extensión de fecha (ntp.conf.date) Ejecutamos dos comandos, cada uno con un espacio de direcciones, el primero elimina las líneas comentadas y el segundo, separado del primero por un punto y coma, elimina las líneas en blanco.
Encontré esta solución en: theurbanpenguin.com
fuente
Ninguna de las otras respuestas parece hacerle justicia, ya sea que salen en líneas vacías o en líneas donde el comentario no está en el primer carácter. Terminé usando esto:
Esto configura un alias, para que no tenga que memorizarlo (lo cual es imposible comenzar). Abra una nueva sesión y tendrá el nuevo
nocom
comando. Entonces puedes simplementeAclamaciones.
fuente
.*$
en la primera expresión regular: el ancla no es útil y no está capturando el texto coincidente para usarlo como reemplazo. use solo^\s*
print "#tag" # Print a hashtag.
Después de la segunda respuesta de Joseph R., agrego
/^$/d
para eliminar la línea en blanco.fuente
Estoy publicando lo que funciona para mí y parece tener más sentido, después de leer los otros, con una explicación. Se acercaron un par de publicaciones, pero aún no podía comentar (porque soy un novato):
-E
= interpretar el siguiente patrón como una expresión regular, similar a usar egrep-v
= imprime la inversión del patrón (se imprimirán las líneas que no coinciden con la expresión)"(^#.*|^$)"
= esto tiene una tubería que designa una instrucción OR. Esta expresión dice que imprima cualquier línea que comience con un#
(y cualquier otra cosa después) O cualquier línea con cero caracteres entre el principio y el final de la línea.El
-v
imprimirá en la pantalla la inversión de eso, que será cualquier línea con caracteres que no comience con a#
.fuente
print "#tag" # Print a hashtag.