好吧,我不知道該怎麼做。
我有一個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