匹配模式更新输出文件在需要时取消注释

匹配模式更新输出文件在需要时取消注释

需要以下建议。有两个文件 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个文件,而第二个文件保持不变。

相关内容