es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

bash no reemplaza una línea en una cadena coincidente debido a que hay más coincidencias.

Esto puede parecer sencillo, pero no pude hacer que funcione. Tengo un archivo de propiedades que contiene lo siguiente.

AVAIL_COLS=col1,col2,col3,col4,col5
SC_AVAIL_COLS=col1,col2,col3

En mi script de bash, realizo un procesamiento y modifico la propiedad de las columnas disponibles, intentando reemplazarla en el archivo. Como se muestra a continuación.

propfile=mi archivo de propiedades
line_avail_cols="AVAIL_COLS="
line_sc_avail_cols="SC_AVAIL_COLS="
available_cols=$(grep $line_avail_cols $propfile | grep -v $line_sc_avail_cols)

# Realizando algunas operaciones para agregar algunos valores más a la misma fila.
available_cols="$available_cols,col6,col7,col8"

# Reemplazar la línea con el nuevo contenido
sed -i '/"$line_avail_cols"/c\''"$available_cols"'' $propfile

El script anterior funciona bien si mi archivo de propiedades solo tiene la propiedad AVAIL_COLS y no SC_AVAIL_COLS.
Pero si el archivo de propiedades contiene la propiedad SC_AVAIL_COLS, en lugar de reemplazar la línea, la agrega como una nueva línea en el archivo, creando una entrada duplicada.

¿Cómo puedo reemplazar directamente la línea de la propiedad AVAIL_COLS? La ubicación o el orden de las propiedades en el archivo pueden variar. Así que estaba buscando una manera genérica.

RESULTADO Esperado

AVAIL_COLS=col1,col2,col3,col4,col5,col6,col7,col8
SC_AVAIL_COLS=col1,col2,col3
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para reemplazar la línea de propiedad AVAIL_COLS sin agregar una nueva línea cuando exista la propiedad SC_AVAIL_COLS en el archivo, puedes usar awk en lugar de sed. Aquí tienes un script actualizado:

    propfile=<mi archivo="" de="" propiedades="">
    line_avail_cols="AVAIL_COLS="
    line_sc_avail_cols="SC_AVAIL_COLS="
    
    # Obtener el número de línea de AVAIL_COLS y el contenido actual de la línea
    avail_cols_line_num=$(grep -n "$line_avail_cols" "$propfile" | cut -d: -f1)
    available_cols=$(grep "$line_avail_cols" "$propfile" | grep -v "$line_sc_avail_cols" | cut -d= -f2)
    
    # Agregar nuevos valores a la variable available_cols
    available_cols="$available_cols,col6,col7,col8"
    
    # Reemplazar el contenido de la línea con el nuevo valor usando awk
    awk -v new_val="$available_cols" -v line_num="$avail_cols_line_num" -v line_start="$line_avail_cols" \
    '{if(NR==line_num)gsub(line_start new_val);print}' "$propfile" > "$propfile.tmp" && mv "$propfile.tmp" "$propfile"
    
    # Imprimir el contenido del archivo para verificar los cambios
    cat "$propfile"
    

    En este script, primero utilizamos grep para obtener el número de línea de la propiedad AVAIL_COLS y su contenido actual. Luego, agregamos los nuevos valores a la variable available_cols.

    En lugar de usar sed para reemplazar la línea, utilizamos awk para reemplazar el contenido de la línea directamente basándonos en su número de línea. Pasamos el nuevo valor y el número de línea como variables a awk y usamos gsub para reemplazar el contenido de la línea.

    Finalmente, guardamos el archivo modificado en un archivo temporal y luego reemplazamos el archivo original con él utilizando mv. Puedes verificar los cambios imprimiendo el contenido del archivo utilizando el comando cat.

Comments are closed.