Sed - 用另一个文件中的regex匹配替换文件中的值

时间:2017-04-20 13:04:53

标签: regex bash awk sed grep

我正在尝试在构建过程中编写一个bash脚本,我们只有一些工具(如grep,sed,awk),我试图用正则表达式匹配的值替换ini文件中的值在另一个。

所以,我匹配像" ^ export ADDRESS = VALUE"在文件export_vars.h中,将VALUE放入名为config.ini的ini文件中,其中包含" ADDRESS = [REPLACE]"。所以,我试图用bash中的一个命令将VALUE替换为[REPLACE]。

我遇到过sed可以获取整个文件并使用

之类的命令将其插入到另一个文件中
sed -i -e "/[REPLACE]/r export_vars.h" config.ini

我需要以某种方式优化此命令以仅从export_vars.h读取模式匹配。有谁知道怎么做?

2 个答案:

答案 0 :(得分:1)

sed用于单个行上的简单替换,即全部。你需要在awk上查看你想要做的事情。类似的东西:

awk '
BEGIN { FS=OFS="=" }
NR==FNR { 
    if ( $1 == "export ADDRESS" ) {
        value = $2
    }
    next
}
{ sub(/\[REPLACE\]/,value); print }
' export_vars.h config.ini

当然,未经测试,因为您没有提供可测试的样本输入/输出。

答案 1 :(得分:1)

awk中的另一个人:

$ awk '/ADDRESS/{if(a!="")$0=a;else a=$NF}NR>FNR' export_vars.h config.ini
ADDRESS=VALUE

说明:

$ awk '
/ADDRESS/ {                 # when ADDRESS is found in record
    if(a!="") $0=a          # if a is set (from first file), use it
    else a=$NF }            # otherwise set a with the last field
NR>FNR                      # print all record of the last file
' export_vars.h config.ini  # mind the order

此解决方案不允许=周围的空间,因为$0已被其他文件中的$NF替换。