我有file1.txt,其中包含:
PropertyA
PropertyB
PropertyC
PropertyD
我有另一个名为file2.txt的文件,其中包含file1.txt中这些参数的值。因此,file2.txt具有如下参数和值:
PropertyA=valueforpropertyA
PropertyB=valueforpropertyB
PropertyC=valueforpropertyC
PropertyD=valueforpropertyD
PropertyE=valueforpropertyE
PropertyF=valueforpropertyF
脚本需要从file2.txt中获取file1.txt中属性的值,并将其写入file1.txt。此外,如果属性没有匹配值,则应忽略。请参阅下面所需的file1.txt输出,如下所示:
PropertyA=valueforpropertyA
PropertyB=valueforpropertyB
PropertyC=valueforpropertyC
PropertyD=valueforpropertyD
注意:应忽略PropertyE和PropertyF的值,因为它们未在file1.txt中声明。
有没有办法检查评论并写入file1.txt
FILE1.TXT
PropertyA
PropertyB
PropertyC
####Some Comments##
PropertyA
PropertyB
PropertyC
PropertyD
file2.txt中的值应该在file1.txt中的注释之后写入属性的值。它不应该在注释之前检查属性,也不应该为它写入值。 file1的输出:
PropertyA
PropertyB
PropertyC
####Some Comments##
PropertyA=valueforpropertyA
PropertyB=valueforpropertyB
PropertyC=valueforpropertyC
PropertyD=valueforpropertyD
如何做到这一点?
答案 0 :(得分:2)
可以使用grep -f
来解决:
grep -Ff file1.txt file2.txt > _file1.txt && mv _file1.txt file1.txt
更新:问题更新后grep
单独无法解决问题。您可以使用以下awk:
awk -F'=' 'FNR==NR{if (p) a[$0]; else {print; if ($0 ~ /####Some Comments##/) p=1} next}
$1 in a' file1.txt file2.txt > _file1.txt && mv _file1.txt file1.txt
<强>输出:强>
PropertyA
PropertyB
PropertyC
####Some Comments##
PropertyA=valueforpropertyA
PropertyB=valueforpropertyB
PropertyC=valueforpropertyC
PropertyD=valueforpropertyD
答案 1 :(得分:1)
你可以source
file2然后循环file1通过indirect variable expansion分配这些变量的值:
(
source f2;
while IFS= read -r line; do printf "%s=%s\n" "$line" "${!line}"; done <f1
) > f3
我在( )
内执行此操作,因此它在子shell中完成,因此,源值不会影响我当前会话中的内容。
所以现在f3
包含:
PropertyA=valueforpropertyA
PropertyB=valueforpropertyB
PropertyC=valueforpropertyC
PropertyD=valueforpropertyD
请注意,采购文件可能很危险,因为它可以运行您不想要的东西。