好吧,我不知道该怎么做。
我有一个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