註解掉與另一個文件中列出的某些 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"

我希望擁有它,以便如果員工 ID 存在於 中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

假設沒有任何雇主 ID 可以被sed、 例如*?或解釋為有效的正規表示式字元\

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

若要就地進行變更(立即修改檔案而不是顯示結果),請新增-iGNUsed-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)- 捕獲一個員工ID4第二個文件行的第 th 字段

if(b[1] in a) $1="#"$1- 檢查是否捕獲員工ID在裡面至關重要的大批。如果是,則新增#至第一個欄位(即在行的開頭)

相關內容