2015-07-11 201 views
2

所以我有一個包含數百萬行的文件。
現在的文件中我有發生,如搜索並替換多個匹配項

=Continent 
=Country 
=State 
=City 
=Street 

現在我有我有應該替換這些事件文本的Excel文件 - 作爲一個例子:
=大陸應及時更換與=亞洲
同樣,對於其他文本

現在,我想編寫一個Java程序來閱讀我的輸入文件,讀取映射文件,並且每次出現搜索和替換。
我在這裏很懶 - 想知道是否可以使用像VIM這樣的編輯器做同樣的事情? 會是可能的嗎?
注 - 我不想做一個單一的文本替換 - 我有多個文本需要被發現和替換,我不想做搜索和手動替換每個。

EDIT1:
內容我的文件,我想更換: 「的1.txt

continent=cont_text 
country=country_text 

包含我要替換的值的文件:「to_replace。 TXT

=cont_text~Asia 
=country_text~India 

,最後用‘sed的’這裏是我的sh文件 - 但我做的事情錯了 - 它不會取代「的1.txt」

while IFS="~" read foo bar; 
do 
echo $foo 
echo $bar 
for filename in 1.txt; do 
    sed -i.backup 's/$foo/$bar/g;' $filename 
done 
done < to_replace.txt 
+0

對於初學者來說,你至少該文本從您的Excel導出文件的一些理智的格式(CSV?),它裝入一個Vim緩衝區或將其保存到一個文件中,並顯示了我們一個樣本。或者,您可以通過說明您的excel文件具有未知密碼並位於不能連接到的其他機器上,使問題更加複雜:P – VanLaser

+0

:)請參閱我的編輯並提供完整詳細信息 - tx –

回答

2

的你不能把$foo$bar單引號中的內容,因爲外殼將不會展開。您不需要for $filename in 1.txt迴路,因爲sed將循環通過1.txt的行。並且您不能在循環內使用-i.backup,因爲它每次都會更改備份文件,而不會保留原始文件。所以,你的腳本應該是:

#!/bin/bash 
cp 1.txt 1.txt.backup 
while IFS="~" read foo bar; 
do 
    echo $foo 
    echo $bar 
    sed -i "s/$foo/=$bar/g;" 1.txt 
done < to_replace.txt 

輸出:

$ cat 1.txt 
continent=Asia 
country=India 
+0

謝謝!這工作完美 –

+1

這取決於你的輸入文件的內容和你執行目錄的內容,會以各種有趣的方式失敗。每當你在shell中編寫一個循環來操縱文本時,你都會有錯誤的方法。 –

0

sed的是個別線路與外殼的簡單替代是從中調用工具不是一個工具來操作文本,以便任何時候你的環境編寫一個shell循環來操縱你正在做錯的文本。

只需使用的工具,誰發明sed和外殼一樣的傢伙還發明瞭做普通文本處理類似的職位,AWK:

​​3210
0

sed命令將做到這一點沒有任何循環:

sed -n 's#\(^=[^~]*\)~\(.*\)#s/\1/=\2/g#p' to_replace.txt |sed -i -f- 1.txt 

或者sed具有擴展的正則表達式:

sed -nr 's#(^=[^~]*)~(.*)#s/\1/=\2/g#p' to_replace.txt | sed -i -f- 1.txt 

說明:

sed的命令:

sed -n 's#\(^=[^~]*\)~\(.*\)#s/\1/=\2/g#p' to_replace.txt 

產生輸出:

s/=cont_text/=Asia/g 
s/=country_text/=India/g 

,然後將其用作sed腳本用於下一sed管道之後。


$ cat 1.txt 
continent=Asia 
country=India