
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.conf
und 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 sed
Unterstützung benötigst -f-
(sonst musst Du sie erst in eine Datei umleiten und dann sed
das 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 -i
für GNU sed
oder -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 newfile
die benötigten Zeilen
a[$1]
- Ansammeln einer Reihe vonMitarbeiter-IDs(als Indizes), während die erste Datei employeeid.txt
verarbeitet 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).