2014-01-28 95 views
2

我有一個帶有鍵值條目的「數據庫文件」,我有另一個文件,其中的鍵出現在其他內容中。現在我想用我的鍵值文件的值替換該關鍵字。例如:替換key:shellcript中另一個文件中的一個文件的值?

有一個文件「keys.txt」與「關鍵字空間的url」:

name1 https://maps.google.com 
something http://www.domain.com/bla.php?value=500 
blabla http://thisis.example.com/moooooar.asp 

我有另一個文件「的text.txt」,其具有每行一個或多個詞語,這樣的:

notrelated somewhatrelated blabla 
blabla unimportant 
asdf asdf asdf name1 dadadada 

而作爲一個結果,我想有這樣的事情:

notrelated somewhatrelated http://thisis.example.com/moooooar.asp 
http://thisis.example.com/moooooar.asp unimportant 
asdf asdf asdf https://maps.google.com dadadada 

其實我的問題很simil ar到https://stackoverflow.com/questions/5283653/,但是在那裏提到的解決方案中沒有解決方案,因爲我正在使用URL(斜槓,冒號......)我想呢?

回答

3
awk ' 
    NR==FNR {url[$1]=$2; next} 
    {for (i=1; i<=NF; i++) if ($i in url) $i=url[$i]; print} 
' keys.txt text.txt 
notrelated somewhatrelated http://thisis.example.com/moooooar.asp 
http://thisis.example.com/moooooar.asp unimportant 
asdf asdf asdf https://maps.google.com dadadada 
+0

woaa!太快!我不能與之競爭;) – Danduk82

+0

你能否快速解釋一下'NR == FNR {url [$ 1] = $ 2;接下來}'確實如此,我無法得到它。 – Danduk82

+1

我知道! ;) - 它確保第一個命令塊只運行第一個文件('keys.txt')。 「NR」是所有文件合併的輸入記錄計數器,「FNR」是每個文件的輸入記錄計數器(爲每個文件復位)。處理第一個文件時它們只會相等。 – grebneke

0

嗯,這個工作(但如果你在你的鑰匙有逗號將可能突破):

while read k v; do sed -e "s,$k,$v,g" -i text.txt; done < keys.txt 
相關問題