Comente secciones de texto que correspondan a ciertos ID enumerados en otro archivo

Comente secciones de texto que correspondan a ciertos ID enumerados en otro archivo

Alguien me puede ayudar con esto. tengo 2 archivos

El primero contiene identificaciones de empleados que dejaron una empresa.

employeeid.txt

5678D956 
45S87954
56898K78
4D856898
556987F8
23657D87

El segundo archivo es un archivo de configuración para una aplicación que almacena la configuración de los usuarios.

App.conf(solo parte del archivo)

/export/home/conf[naa.5678D956]/displayName = "John Paul (naa.5678D956)"
/export/home/conf[naa.5678D956]/Scripts = "true"
/export/home/conf[naa.5678D956]/FTP = "true"
/export/home/conf[naa.5678D956]/HomeDirs = "true" 
/export/home/conf[naa.4487984D]/displayName = "Cara Jones (naa.4487984D)"  
/export/home/conf[naa.4487984D]/Scripts = "false"
/export/home/conf[naa.4487984D]/FTP = "true"
/export/home/conf[naa.4487984D]/HomeDirs = "true" 
/export/home/conf[naa.45S87954]/displayName = "Eimer Fenton (naa.45S87954)"
/export/home/conf[naa.45S87954]/Scripts = "true"
/export/home/conf[naa.45S87954]/FTP
/export/home/conf[naa.45S87954]/HomeDirs = "true"
/export/home/conf[naa.56898K78]/displayName = "Edd Waters (naa.56898K78)"
/export/home/conf[naa.56898K78]/Scripts = "true"
/export/home/conf[naa.56898K78]/FTP = "true"
/export/home/conf[naa.56898K78]/HomeDirs = "true"
/export/home/conf[naa.909878S4]/displayName = "Phil Mooney (naa.909878S4)"  
/export/home/conf[naa.909878S4]/Scripts
/export/home/conf[naa.909878S4]/FTP = "true"
/export/home/conf[naa.909878S4]/HomeDirs  = "true"

Me gustaría tenerlo de modo que, si existe una identificación de empleado employeeid.txt, comente su configuración App.confy se guarde como un archivo nuevo.

#/export/home/conf[naa.5678D956]/displayName = "John Paul (naa.5678D956)"
#/export/home/conf[naa.5678D956]/Scripts = "true"
#/export/home/conf[naa.5678D956]/FTP = "true"
#/export/home/conf[naa.5678D956]/HomeDirs = "true" 
/export/home/conf[naa.4487984D]/displayName = "Cara Jones (naa.4487984D)"  
/export/home/conf[naa.4487984D]/Scripts = "false"
/export/home/conf[naa.4487984D]/FTP = "true"
/export/home/conf[naa.4487984D]/HomeDirs = "true" 
#/export/home/conf[naa.45S87954]/displayName = "Eimer Fenton (naa.45S87954)"
#/export/home/conf[naa.45S87954]/Scripts = "true"
#/export/home/conf[naa.45S87954]/FTP
#/export/home/conf[naa.45S87954]/HomeDirs = "true"
#/export/home/conf[naa.56898K78]/displayName = "Edd Waters (naa.56898K78)"
#/export/home/conf[naa.56898K78]/Scripts = "true"
#/export/home/conf[naa.56898K78]/FTP = "true"
#/export/home/conf[naa.56898K78]/HomeDirs = "true"
/export/home/conf[naa.909878S4]/displayName = "Phil Mooney (naa.909878S4)"  
/export/home/conf[naa.909878S4]/Scripts
/export/home/conf[naa.909878S4]/FTP = "true"
/export/home/conf[naa.909878S4]/HomeDirs  = "true"

He estado intentando que funcione con sed, pero no he logrado nada

Respuesta1

Suponiendo que no haya ningún ID de empleador que pueda interpretarse como caracteres de expresión regular válidos sed, por ejemplo *, ?o \:

sed 's:^/export/home/conf\[naa.\('"$(paste -sd '|' employeeid.txt)"'\)\]:#&:' App.conf

Si tiene muchas identificaciones de empleadores, por lo que la línea resultante se vuelve demasiado larga y su sedsoporte -f-(de lo contrario, primero debe redirigirlo a un archivo y luego dejar sedleer el script):

{
  printf '%s' 's:^/export/home/conf\[naa.\(';
  paste -sd '|' employeeid.txt;
  printf '%s' '\)\]:#&:';
} | tr -d '\n' | sed -f- App.conf

Para realizar los cambios en el lugar (modificando el archivo de inmediato en lugar de mostrarle los resultados), agregue -ipara GNU sedo -i ''FreeBSD sed.

Respuesta2

while read employeeid; do
    sed --in-place "/$employeeid/s/^/#/" /path/to/App.conf
done < employeeid.txt

Respuesta3

papar moscas(GNU awk) enfoque:

awk 'NR==FNR{a[$1]; next}{match($4, /\[naa\.([0-9A-Z]+)\]/, b); 
     if(b[1] in a) $1="#"$1;}1' OFS="/" employeeid.txt FS="/" App.conf > newfile

Ahora, newfilecontiene las líneas necesarias.


a[$1]- acumular una serie deidentificaciones de empleadosemployeeid.txt(como índices) mientras se procesa el primer archivo

FS="/"- separador de campo para el segundo archivoApp.conf

match($4, /\[naa\.([0-9A-Z]+)\]/, b)- captura unID de empleadodentro de4º campo de la línea de un segundo archivo

if(b[1] in a) $1="#"$1- comprueba si el capturadoID de empleadoestá en elcrucialformación. Si es así, agrega #al primer campo (es decir, al principio de la línea)

información relacionada