Comente seções de texto que correspondem a determinados IDs listados em outro arquivo

2

Alguém pode me ajudar com isso. Tenho 2 arquivos

Primeiro, contém IDs de funcionários que saíram de uma empresa

employeeid.txt

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

Segundo arquivo é um arquivo de configuração para um aplicativo que armazena configurações de usuários

App.conf (apenas parte do arquivo)

/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"

Eu gostaria de ter um ID de funcionário em employeeid.txt , que comente a configuração deles em App.conf e salve como novo arquivo

#/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"

Eu tenho tentado fazê-lo funcionar com sed, mas não consegui chegar a lugar algum

    
por ICRealTime 25.04.2017 / 21:11

3 respostas

1

Supondo que não existem IDs de empregador com os quais possam ser interpretados como caracteres de expressão regular válidos por sed , por ex. * , ? ou \ :

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

Se você tiver muitos IDs de empregador para que a linha resultante fique muito longa e sed suporte -f- (caso contrário, você terá que redirecioná-la para um arquivo primeiro e depois deixar sed ler o script):

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

Para fazer as alterações no local (modificando o arquivo imediatamente, em vez de mostrar os resultados), adicione -i para o GNU sed ou -i '' para o FreeBSD sed .

    
por 25.04.2017 / 21:31
1
while read employeeid; do
    sed --in-place "/$employeeid/s/^/#/" /path/to/App.conf
done < employeeid.txt
    
por 25.04.2017 / 21:23
1
Abordagem

gawk (GNU awk):

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

Agora, newfile contém as linhas necessárias

a[$1] - acumulando uma matriz de IDs de funcionários (como índices) enquanto o primeiro arquivo employeeid.txt é processado

FS="/" - separador de campo para o segundo arquivo App.conf

match($4, /\[naa\.([0-9A-Z]+)\]/, b) - captura um ID do funcionário dentro do 4 th campo da linha de um segundo arquivo

if(b[1] in a) $1="#"$1 - verifica se o ID do funcionário

capturado está na matriz crucial . Em caso afirmativo, adiciona # ao primeiro campo (ou seja, no início da linha)

    
por 25.04.2017 / 21:40