別のファイルにリストされている特定のIDに対応するテキストのセクションをコメントアウトします。

別のファイルにリストされている特定のIDに対応するテキストのセクションをコメントアウトします。

誰か助けてもらえませんか。2つのファイルがあります

最初のものは会社を辞めた従業員のIDを含む

employeeid.txt

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

2番目のファイルは、ユーザーの設定を保存するアプリケーションの設定ファイルです。

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="/"- 2番目のファイルのフィールド区切り文字App.conf

match($4, /\[naa\.([0-9A-Z]+)\]/, b)- キャプチャ従業員ID以内42番目のファイルの行の番目のフィールド

if(b[1] in a) $1="#"$1- キャプチャされたかどうかを確認します従業員IDの中に重要な配列。そうであれば、#最初のフィールド(つまり行の先頭)に追加します。

関連情報