需要以下建议。有两个文件 myfile 和 responsefile。
第一个文件
myfile.txt
user=myname
user_1=yourname
group=mygroup
group_1=yourgroup
第二个文件
responsefile.txt
#Please fill details
user=
#user_1=
#user_2=
#Please fill details
group=
#group_1=
#group_2=
根据 myfile.txt 数据更新 responsefile.txt 如下,文件 responsefile.txt 长度约为 604L,16481C。
结果输出
responsefile.txt
#Please fill details
user=myname
user_1=yourname
#user_2=
#Please fill details
group=mygroup
group_1=yourgroup
#group_2=
如果你观察上面的 myfile,我想匹配用户=在响应文件中,然后更新为用户=我的名字,同样适用于 group=。然后匹配用户_1=和组1=在响应文件中对其进行了散列或注释,更新为user_1=你的名字和group_1=你的群组. 不应删除文件中其他内容的哈希值或取消注释。
我试过这个
awk -F= 'NR==FNR{a[$1]=$0;next}$1 in a{$0=a[$1]}1' myfile.txt responsefile.txt
请提前提出建议,谢谢。
答案1
这是一个 shell + sed 脚本,它将选择变量名称和值(在循环前面),然后将它们编辑到文件中(在循环内的多次传递中):
#!/bin/sh
sed -nr 's/^([^=#][^=]*)=(.*)$/\1\n\2/p' "$1" |
while read var ; read val ; do
sed -ri "s/^#?($var=) *$/\1$val/" "$2"
done
脚本的第一个参数是包含值的文件 ( myfile.txt
)。第二个参数是要填充的文件 ( responsefile.txt
)。第二个文件是现场编辑的。脚本不会特别处理空格(除了 之后的空格=
)responsefile.txt
,因为问题中没有明确应该如何处理。
以下是您的 AWK 脚本的扩展,该脚本已完成,可在演示文件中显示的所有情况下使用。首先,它将填充第一个文件中的关联数组,然后它将修改第二个文件的内容并将其发送到stdout
。我不会将其呈现为一行代码以保持其可读性:
#!/usr/bin/awk -f
BEGIN { FS="=" }
NR==FNR { a[$1]=$0; next }
$1 in a { $0=a[$1] }
/^#/ { var=$1; sub(/^#/, "", var); if(var in a) { $0=a[var] } }
1
您的脚本只需要对注释的作业进行特殊处理。脚本的参数与第一个脚本相同,但输出被发送到第二stdout
个文件,而第二个文件保持不变。