
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.conf
y 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 sed
soporte -f-
(de lo contrario, primero debe redirigirlo a un archivo y luego dejar sed
leer 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 -i
para GNU sed
o -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, newfile
contiene 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)