我有一個巨大的SQL文件在服務器上執行。轉儲來自我的機器,其中有幾個與我的機器相關的設置。所以基本上,我希望"c://temp"
的每一個出現都被"//home//some//blah"
替代Linux命令用另一個字符串替換LARGE文件中的字符串
這怎麼可以從命令行完成?
我有一個巨大的SQL文件在服務器上執行。轉儲來自我的機器,其中有幾個與我的機器相關的設置。所以基本上,我希望"c://temp"
的每一個出現都被"//home//some//blah"
替代Linux命令用另一個字符串替換LARGE文件中的字符串
這怎麼可以從命令行完成?
sed是大文件的不錯選擇。
sed -i.bak -e 's%C://temp%//home//some//blah%' large_file.sql
這是一個不錯的選擇,因爲不會立即讀取整個文件來更改它。引述手冊:
甲流編輯器用於對輸入 流(從一個 管道文件或輸入)執行 基本文本轉換。儘管在某些方面 與允許腳本編輯 編輯(例如編輯)的編輯器相似,但sed作品 僅輸入一個通過 輸入,並且因此更有效地是 。但它是sed在流水線中過濾文本的能力,其中 特別將其與 區別於其他類型的編輯器。
相關的說明書部分是here。一個小的解釋如下
-i.bak能夠就地編輯留下一個備份副本.bak擴展
S%FOO%欄中%用途秒,替換命令,第一串的其中 代用品比賽 位於%符號'foo'之間,用於第二個 字符串'bar'。通常寫成s // ,但由於您的字符串有大量的斜槓 ,因此更方便 將它們更改爲其他內容,以便您避免必須轉義它們。
例
[email protected]:~$ sed -i.bak -e 's%C://temp%//home//some//blah%' a.txt [email protected]:~$ more a.txt //home//some//blah D://temp //home//some//blah D://temp [email protected]:~$ more a.txt.bak C://temp D://temp C://temp D://temp
您可以使用不同的字符來避免引用斜線,例如sed -e「s%C:// temp%/ home // some //嗒嗒%」。 此外,-i選項允許您在確定選項時將文件保存在原位。 – dalloliogm 2009-08-07 10:59:06
這是我輸入的命令: sed -i.bak -e's%C:\\ temp \%/ home/liveon/public_html/tmp'liveon.sql 這是我的錯誤得到: sed:-e表達式#1,字符41:未終止的's'命令 任何人? – coderama 2009-08-07 11:45:44
你錯過了最後的%,命令是%foo%bar% – 2009-08-07 11:51:16
sed
該命令可以做到這一點。 而不是逃避斜線,您可以選擇不同的分隔符(_在這種情況下):
sed -e 's_c://temp/_/home//some//blah/_' file1.txt > file2.txt
你錯過了最後一個下劃線:「s_c:// temp/_/home // some // blah_」 – dalloliogm 2009-08-07 11:01:40
謝謝!現在已修好。 – stefanw 2009-08-07 11:03:27
嘗試sed?例如:
sed 's/c:\/\/temp/\/\/home\/\/some\/\/blah/' mydump.sql > fixeddump.sql
轉義所有這些斜線使得這看起來很可怕,但這是一個更簡單的例子,它將foo更改爲bar。
sed 's/foo/bar/' mydump.sql > fixeddump.sql
正如其他人所指出的那樣,你可以選擇你自己的分隔符,這將防止leaning toothpick syndrome在這種情況下:
sed 's|c://temp\\|home//some//blah|' mydump.sql > fixeddump.sql
關於sed的巧妙的事情是,它在流而操作而不是一個文件,因此您只能使用適量的內存來處理大文件。
謝謝Paul! Intellij Idea變得瘋狂並且做了幾十分鐘,而使用sed則只需1秒,在我的sql文件中用雙反斜槓替換反斜槓。 – gumkins 2013-10-21 15:10:39
只是爲了完整。替換使用perl
。
perl -i -p -e 's{c://temp}{//home//some//blah}g' mysql.dmp
也不需要反斜槓轉義。 ;)
請注意,如果您使用'-i'標誌而沒有擴展名,則會得到*無備份*。如果你想備份,可以嘗試使用'-i.bak'來執行就地編輯*和*將原始文件備份爲'original.bak',幾乎免費。 – Telemachus 2009-08-07 14:15:21
我讓版本控制系統處理備份。 – jrockway 2009-08-08 02:53:33
@Jrockway:我相信這對你很可愛,但它假定有問題的文件受版本控制,並且你知道-i.bak做了什麼並且選擇不使用它。我只希望那些推薦-i開關的人花兩秒鐘來解釋-i和-i.bak之間的區別。如果您使用的文件不受版本控制,並且輸入了簡單的錯字(例如,忘記-p標誌),那麼這將非常不利。 – Telemachus 2009-08-08 11:49:04
還有一個非標準的UNIX實用程序rpl,它與sed
的例子完全相同;然而,我不確定rpl
是否可以順利運行,因此sed
可能是更好的選擇。
嘿,每次機會,你是rpl開發者的朋友嗎?:-) – 2009-08-07 11:22:48
不,從來沒有聽說過util之外的人;它可以在數千個文本文件上執行一次批量替換作業,並且保存在我的工具箱中。 – 2009-08-07 12:46:01
值得一提的是,爲什麼*你在這種情況下推薦它(或者爲什麼你可能,因爲你收回了一半的建議)。也就是說,不要只是提供實用程序的名稱,請告訴我們您喜歡它的方式。 – Telemachus 2009-08-07 14:18:29
perl -pi -e 's#c://temp#//home//some//blah#g' yourfilename
-p會將此腳本視爲一個循環,它將逐行讀取指定的文件,並運行正則表達式搜索並替換。
-i此標誌應與-p標誌一起使用。這命令Perl編輯文件。
-e只是表示執行此Perl代碼。
好運
感謝您的解釋 – 2017-07-05 02:33:32
GAWK
awk '{gsub("c://temp","//home//some//blah")}1' file
你缺少你的命令尾隨%。這是s%foo%bar%not s%foo%bar – 2009-08-07 12:27:40