Kommentieren Sie Textabschnitte aus, die bestimmten IDs entsprechen, die in einer anderen Datei aufgelistet sind.

Kommentieren Sie Textabschnitte aus, die bestimmten IDs entsprechen, die in einer anderen Datei aufgelistet sind.

Kann mir jemand dabei helfen? Ich habe 2 Dateien

Die erste enthält die IDs von Mitarbeitern, die ein Unternehmen verlassen haben

employeeid.txt

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

Die zweite Datei ist eine Konfigurationsdatei für eine Anwendung, die Benutzereinstellungen speichert

App.conf(nur ein Teil der Datei)

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

Ich möchte, dass, wenn eine Mitarbeiter-ID in vorhanden ist employeeid.txt, ihre Konfigurationseinstellung auskommentiert App.confund als neue Datei gespeichert wird.

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

Ich habe versucht, es mit sed zum Laufen zu bringen, bin aber nicht weitergekommen

Antwort1

Vorausgesetzt, es gibt keine Arbeitgeber-IDs, die als gültige reguläre Ausdruckszeichen interpretiert werden könnten sed, z. *B. ?oder \:

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

Falls Du sehr viele Arbeitgeber-IDs hast, so dass die resultierende Zeile zu lang wird und Du sedUnterstützung benötigst -f-(sonst musst Du sie erst in eine Datei umleiten und dann seddas Skript lesen lassen):

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

Um die Änderungen direkt vorzunehmen (die Datei sofort zu ändern, anstatt Ihnen die Ergebnisse anzuzeigen), fügen Sie -ifür GNU sedoder -i ''für FreeBSD hinzu sed.

Antwort2

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

Antwort3

gaffen(GNU awk) Ansatz:

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

Enthält nun newfiledie benötigten Zeilen


a[$1]- Ansammeln einer Reihe vonMitarbeiter-IDs(als Indizes), während die erste Datei employeeid.txtverarbeitet wird

FS="/"- Feldtrennzeichen für die zweite DateiApp.conf

match($4, /\[naa\.([0-9A-Z]+)\]/, b)- erfasst einAngestellten IDinnerhalb der4te Feld einer zweiten Dateizeile

if(b[1] in a) $1="#"$1- prüft, ob die erfasstenAngestellten IDist in dementscheidendArray. Wenn ja, wird es #zum ersten Feld hinzugefügt (also am Anfang der Zeile).

verwandte Informationen