2013-09-21 72 views
0

這個問題擴展了我最後一個問題(Search for specific line of text file, replace up to a certain character)。從用戶@anubhava的幫助,我能夠從用bash變量替換文本文件行中的第5和第6個「word」

dataspecs v1 v2 v3 v4 v5 ! blah搜索開始dataspecs線,並將其轉換到

dataspecs $new_val ! blah

不過,我現在需要能夠保持變量v1v2v3(我不知道它們的實際值),並用bash變量$new_v4$new_v5替換v4v5。所以我的新生產線將是這個樣子的:

dataspecs v1 v2 v3 new_v4 new_v5 ! blah

+0

我想我要麼需要'sed'(1)告訴SED找到dataspecs'的'第一實例,在該行的一些分配給每個字的另一種選擇,並且在「words」6和7上做subs,或者(2)告訴sed查找'dataspecs'的第一個實例,以及空格和'!'之間的所有空白和子空間的第四個實例。 – brastein

回答

5
awk -v n4="$new4" -v n5="$new5" '/^dataspecs/{$5=n4;$6=n5}7' file 
+0

謝謝Kent,但是我在哪裏告訴它只對'dataspecs'開始的行執行subs?你能告訴我'7'是什麼嗎? – brastein

+0

Dataspecs我認爲這是一個普通的字符串像foobar – Kent

+0

是的,這是一個正常的字符串,但你可以添加代碼替換隻發生在'dataspecs'開始的行嗎?該文件有很多其他的行。 – brastein

1

肯特的解決方案是巨大的。下面是涉及直接訪問shell變量內awk

awk '/^dataspecs/{$5=ENVIRON["new_v4"];$6=ENVIRON["new_v5"];}{print}' file.txt > newfile.txt 
+0

該解決方案由於某種原因用空格替換了兩個變量。 – brastein

+0

@brastein,請注意,shell變量需要先導出 – iruvar

+0

這是如何完成的?肯特的解決方案似乎把他們從bash中,沒有問題....此外,我發現'dataspecs'和'v1'之間有**兩個**空白字符。你知道我怎麼能把這個保留爲兩個,而不是像Kent的解決方案那樣變成一個? – brastein

相關問題