用其他文件中的值替换文本字段

用其他文件中的值替换文本字段

好吧,我不知道该怎么做。

我有一个fileA看起来像这样的:

([7]RIMS_ID)                                            : "CNR"       
(refGain_A[7])                                          : 1           
(RIMSclockBias_A[7])                                    : -398015316.7
(RIMSclockDrift_A[7])                                   : -6442.29    
(RIMSclockSigma_A[7])                                   : .01         
(RIMSclockSigY_A[7])                                    : 0        

([8]RIMS_ID)                                            : "ABS"       
(refGain_A[8])                                          : 1           
(RIMSclockBias_A[8])                                    : -374515458
(RIMSclockDrift_A[8])                                   : -6442.29    
(RIMSclockSigma_A[8])                                   : .01         
(RIMSclockSigY_A[8])                                    : 0     

依此类推,[索引]从 0 到 71,每个站都有不同的 ID。

我想将每个电台的字符串对应的值替换RIMSclockBias_A为另一个电台的值,fileB如下所示:

CNR -44163754.49
ABS 3417370.112
...

所以要有:

([7]RIMS_ID)                                            : "CNR"       
(refGain_A[7])                                          : 1           
(RIMSclockBias_A[7])                                    : -44163754.49
(RIMSclockDrift_A[7])                                   : -6442.29    
(RIMSclockSigma_A[7])                                   : .01         
(RIMSclockSigY_A[7])                                    : 0        

([8]RIMS_ID)                                            : "ABS"       
(refGain_A[8])                                          : 1           
(RIMSclockBias_A[8])                                    : 3417370.112
(RIMSclockDrift_A[8])                                   : -6442.29    
(RIMSclockSigma_A[8])                                   : .01         
(RIMSclockSigY_A[8])                                    : 0 

grep我可以通过infor循环 和的组合来隔离正确的字段awk,但我不知道如何替换文件本身中的值。sed需要知道我想要替换为输入的确切值,因此这是不可行的。

任何想法?

答案1

这与另一个问题clockBias仅在这种情况下,必须在模式后匹配的第一行进行替换。如果你没有特殊字符,fileB你可以运行gnu sed

sed -E 's|(.*)[[:blank:]](.*)|/\1/,/clockBias/{/clockBias/{s/(:[[:blank:]]{1,})(.*)/\\1\2/}}|' fileB | sed -Ef - fileA

这只是将你的行fileB变成sed命令,例如:

/CNR/,/clockBias/{/clockBias/{s/(:[[:blank:]]{1,})(.*)/\1-44163754.49/}}

然后将它们传递给第二个sed进行处理fileA


对于未知的输入,您必须转义中的任何特殊字符左/右正如我在回答另一个问题时所解释的那样(这次使用布雷句法):

sed 's|\(.*\)[[:blank:]]\{1,\}\(.*\)|\1\
\2|
h
s|.*\n||
s|[\&/]|\\&|g
x
s|\n.*||
s|[[\.*^$/]|\\&|g
G
s|\(.*\)\n\(.*\)|/\1/,/clockBias/{/clockBias/{s/\\(:[[:blank:]]\\{1,\\}\\)\\(.*\\)/\\1\2/}}|' fileB | sed -f - fileA

相关内容