有人可以帮我解决这个问题吗?我有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
要就地进行更改(立即修改文件而不是显示结果),请添加-i
GNUsed
或-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)
- 捕获一个员工ID内4第二个文件行的第 th 字段
if(b[1] in a) $1="#"$1
- 检查是否捕获员工ID在里面至关重要的大批。如果是,则添加#
到第一个字段(即在行的开头)