2009-08-07 127 views
8

我有一個巨大的SQL文件在服務器上執行。轉儲來自我的機器,其中有幾個與我的機器相關的設置。所以基本上,我希望"c://temp"的每一個出現都被"//home//some//blah"替代Linux命令用另一個字符串替換LARGE文件中的字符串

這怎麼可以從命令行完成?

+0

你缺少你的命令尾隨%。這是s%foo%bar%not s%foo%bar – 2009-08-07 12:27:40

回答

29

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 
+2

您可以使用不同的字符來避免引用斜線,例如sed -e「s%C:// temp%/ home // some //嗒嗒%」。 此外,-i選項允許您在確定選項時將文件保存在原位。 – dalloliogm 2009-08-07 10:59:06

+0

這是我輸入的命令: 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

+0

你錯過了最後的%,命令是%foo%bar% – 2009-08-07 11:51:16

1

sed該命令可以做到這一點。 而不是逃避斜線,您可以選擇不同的分隔符(_在這種情況下):

sed -e 's_c://temp/_/home//some//blah/_' file1.txt > file2.txt 
+0

你錯過了最後一個下劃線:「s_c:// temp/_/home // some // blah_」 – dalloliogm 2009-08-07 11:01:40

+0

謝謝!現在已修好。 – stefanw 2009-08-07 11:03:27

4

嘗試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的巧妙的事情是,它在而操作而不是一個文件,因此您只能使用適量的內存來處理大文件。

+0

謝謝Paul! Intellij Idea變得瘋狂並且做了幾十分鐘,而使用sed則只需1秒,在我的sql文件中用雙反斜槓替換反斜槓。 – gumkins 2013-10-21 15:10:39

12

只是爲了完整。替換使用perl

perl -i -p -e 's{c://temp}{//home//some//blah}g' mysql.dmp 

也不需要反斜槓轉義。 ;)

+10

請注意,如果您使用'-i'標誌而沒有擴展名,則會得到*無備份*。如果你想備份,可以嘗試使用'-i.bak'來執行就地編輯*和*將原始文件備份爲'original.bak',幾乎免費。 – Telemachus 2009-08-07 14:15:21

+0

我讓版本控制系統處理備份。 – jrockway 2009-08-08 02:53:33

+3

@Jrockway:我相信這對你很可愛,但它假定有問題的文件受版本控制,並且你知道-i.bak做了什麼並且選擇不使用它。我只希望那些推薦-i開關的人花兩秒鐘來解釋-i和-i.bak之間的區別。如果您使用的文件不受版本控制,並且輸入了簡單的錯字(例如,忘記-p標誌),那麼這將非常不利。 – Telemachus 2009-08-08 11:49:04

3

還有一個非標準的UNIX實用程序rpl,它與sed的例子完全相同;然而,我不確定rpl是否可以順利運行,因此sed可能是更好的選擇。

+0

嘿,每次機會,你是rpl開發者的朋友嗎?:-) – 2009-08-07 11:22:48

+0

不,從來沒有聽說過util之外的人;它可以在數千個文本文件上執行一次批量替換作業,並且保存在我的工具箱中。 – 2009-08-07 12:46:01

+0

值得一提的是,爲什麼*你在這種情況下推薦它(或者爲什麼你可能,因爲你收回了一半的建議)。也就是說,不要只是提供實用程序的名稱,請告訴我們您喜歡它的方式。 – Telemachus 2009-08-07 14:18:29

1
perl -pi -e 's#c://temp#//home//some//blah#g' yourfilename 

-p會將此腳本視爲一個循環,它將逐行讀取指定的文件,並運行正則表達式搜索並替換。

-i此標誌應與-p標誌一起使用。這命令Perl編輯文件。

-e只是表示執行此Perl代碼。

好運

+0

感謝您的解釋 – 2017-07-05 02:33:32

1

GAWK

awk '{gsub("c://temp","//home//some//blah")}1' file 
相關問題