다른 파일에 나열된 특정 ID에 해당하는 텍스트 섹션을 주석 처리합니다.

다른 파일에 나열된 특정 ID에 해당하는 텍스트 섹션을 주석 처리합니다.

누군가 나를 도와 줄 수 있습니까? 파일이 2개 있어요

첫 번째에는 회사를 떠난 직원의 ID가 포함되어 있습니다.

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에 직원 ID가 있는 경우 해당 구성 설정을 주석 처리 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예를 들어 또는 에 의해 유효한 정규식 문자로 해석될 수 있는 고용주 ID가 없다고 가정합니다 .*?\

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

고용주 ID가 너무 많아서 결과 줄이 너무 길어지고 sed지원이 필요한 경우 -f-(그렇지 않으면 먼저 파일로 리디렉션한 다음 sed스크립트를 읽어야 합니다):

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

그 자리에서 변경하려면(결과를 표시하는 대신 즉시 파일 수정) -iGNU 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]- 배열을 축적직원 ID(색인으로) 첫 번째 파일이 employeeid.txt처리되는 동안

FS="/"- 두 번째 파일의 필드 구분 기호App.conf

match($4, /\[naa\.([0-9A-Z]+)\]/, b)- 캡처직원 아이디4두 번째 파일 줄의 번째 필드

if(b[1] in a) $1="#"$1- 캡쳐되었는지 확인직원 아이디중대한정렬. 그렇다면 #첫 번째 필드(즉, 줄의 시작 부분)에 추가합니다.

관련 정보