Закомментируйте разделы текста, соответствующие определенным идентификаторам, перечисленным в другом файле.

Закомментируйте разделы текста, соответствующие определенным идентификаторам, перечисленным в другом файле.

Может ли кто-нибудь помочь мне с этим. У меня есть 2 файла

Первый содержит идентификаторы сотрудников, покинувших компанию.

employeeid.txt

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

Второй файл — это файл конфигурации для приложения, в котором хранятся настройки пользователя.

App.conf(только часть файла)

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

Я хотел бы, чтобы если идентификатор сотрудника существует в employeeid.txt, он комментировал его настройки конфигурации App.confи сохранял как новый файл.

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

Я пытался заставить это работать с sed, но ничего не вышло.

решение1

Предположим, что нет никаких идентификаторов работодателей, которые могли бы быть интерпретированы как допустимые символы регулярного выражения sed, например *, ?или \:

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

Если у вас много идентификаторов работодателей, из-за чего результирующая строка становится слишком длинной, и ваша sedподдержка -f-(в противном случае вам придется сначала перенаправить ее в файл, а затем дать sedпрочитать скрипт):

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

Чтобы внести изменения на месте (немедленно изменив файл, а не показав вам результаты), добавьте -iдля GNU sedили -i ''для FreeBSD sed.

решение2

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

решение3

таращиться(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

Теперь newfileсодержит необходимые строки


a[$1]- накопление массиваидентификаторы сотрудниковemployeeid.txt(как индексы) пока обрабатывается первый файл

FS="/"- разделитель полей для второго файлаApp.conf

match($4, /\[naa\.([0-9A-Z]+)\]/, b)- захватываетидентификатор сотрудникав пределах4th поле второй строки файла

if(b[1] in a) $1="#"$1- проверяет, захвачен лиидентификатор сотрудниканаходится включевоймассив. Если да, то добавляется #к первому полю (т.е. в начало строки)

Связанный контент