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
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:
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.