Saltar al contenido

¿Cómo hacer que la “lectura” incorporada de bash ignore las líneas comentadas o vacías?

Este grupo de trabajo ha estado largas horas investigando respuestas a tu pregunta, te dejamos la respuesta por esto nuestro objetivo es serte de mucha apoyo.

Solución:

No necesita un archivo temporal para hacer esto, y sed (o awk) son mucho más flexibles en el procesamiento de comentarios que una declaración de caso de shell.

Por ejemplo:

configfile='/opt/myconfigfile.txt'
[ $# -gt 0 ] && [ -r "$1" ] && configfile="$1"

sed -e 's/[[:space:]]*#.*// ; /^[[:space:]]*$/d' "$configfile" |
    while read var1 var2 var3 var4; do
      # stuff with var1, etc.
    done

Esto elimina los comentarios (con o sin espacios en blanco iniciales) y elimina las líneas vacías de la entrada antes de canalizarlas al ciclo while. Maneja los comentarios en las líneas por sí mismos y los comentarios agregados al final de la línea:

# full-line comment
# var1 var2 var3 var4
abc 123 xyz def # comment here

Vocación sed o awk para tareas como esta no es “absurdo”, es perfectamente normal. Para eso están estas herramientas. En cuanto al rendimiento, apostaría a que en todo menos en archivos de entrada muy pequeños, el sed La versión sería mucho más rápida. Tubería a sed tiene algunos gastos generales de inicio pero se ejecuta muy rápido, mientras que el shell es lento.

Esto funciona porque read rompe todo en espacios en blanco (IFS), por lo que si var1 está vacío o comienza con ‘#’, sáltelo.

while read var1 var2 var3 var4; do
   case $var1 in
       ''|#*) continue ;;         # skip blank lines and lines starting with #
   esac
   echo "var1: '$var1'"
   # stuff with var1, etc.
done < "$1:-default_config_file"

Luego, la entrada debe redirigirse al bucle en lugar de al while lista de comandos El "$1:-default_config_file" se expande al primer parámetro de la línea de comando si no está vacío; de lo contrario, se expande a default_config_file también puede usar expansión variable, etc. en el valor predeterminado string.

Debido a que está interesado en minimizar el preprocesamiento, creo que esto es equivalente, pero también elimina todos los comentarios:

while read line; do
    echo "$line%%#*" | 
        read var1 var2 var3 var4
        [ -z "$var1" ] && continue
        # stuff with var1, etc.
        for i in 1 2 3 4; do eval echo ""var$i: $var$i""; done  #debug only!
    
done < "$1:-default_config_file"

Esto utiliza la función de procesamiento de subcadenas de expansión de parámetros de shell. $line%%#* se expande al valor original de line excepto el primero # y todo después de que se eliminan. Carga eso en var1-4 y continuar como de costumbre. la prueba a continue se acorta porque ahora solo necesitamos verificar si está vacío stringno #.

Comentarios y puntuaciones del artículo

Acuérdate de que te brindamos la opción de parafrasear tu experiencia si te fue de ayuda.

¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 4)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *