将值复制到多个文件中的属性

时间:2016-04-22 10:09:59

标签: bash shell unix

我有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

如何做到这一点?

2 个答案:

答案 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

请注意,采购文件可能很危险,因为它可以运行您不想要的东西。