2014-02-19 60 views
0

我剛開始學習Perl,我的主要目標是替換文本行。假設我有以下文本文件;Perl - 用不同的匹配替換txt文件中的行

manufacturer=BMW 
manufacturer=Honda 
manufacturer=Mercedes 
manufacturer=Toyota 
manufacturer=Noble 
manufacturer=Maserati 
manufacturer=Jaguar 
manufacturer=Ford 

我想要替換所有行,以便文本文件看起來像這樣;

manufacturer=XXX 
manufacturer=XXX 
manufacturer=XXX 
manufacturer=XXX 
manufacturer=XXX 
manufacturer=XXX 
manufacturer=XXX 
manufacturer=XXX 

我已經學會了如何更換線,特殊情況如下匹配與我預期的文本文字;

s/BMW/XXX/ig 

但考慮到在這個文件中我有不同的情況,我不想繼續更新與不同製造商(本田,奔馳,豐田)每次,然後重新運行代碼的Perl代碼。當然,必須有一個方式,我可以簡單地用開頭的行搜索(無需擔心製造商)

manufacturer=*whatever* 

,然後用

manufacturer=XXX 

更換整條生產線可有人請一些線索怎麼去做這件事?

+0

如果您想要更改* all *行,您可以在文件中簡單地每行打印一次'manufacturer = XXX'。即'perl -lne'print「製造商= XXX」'輸入>輸出' – TLP

+0

謝謝TLP。這會覆蓋現有文件中'manufacturer = XXX'的每一行嗎? – Triple777er

+0

它將爲文件中的每一行寫入一行文件到一個新文件。我不推薦覆蓋新手,但可以用'-i'標誌來完成。請記住,變化是不可逆轉的。 – TLP

回答

0

對正則表達式的作業:

s/manufacturer=.*/manufacturer=XXX/g 

根據您的評論,這種匹配=和EOL之間的一切,並與XXX替換它。

綜合文檔here

+0

非常感謝! – Triple777er

+0

如果你有這個製造商,這將創建'manufacturer = XXX Romeo'這一行。 – TLP

+0

@TLP是的,正如我所提到的,op可能需要根據需要調整RegEx。一個完美的正則表達式可以匹配地球上所有汽車的品牌/型號,這不是一項繁雜的任務(除非,如op的樣本數據集,當然這個品牌總是在'='和EOL之間) – Madbreaks

1

你需要利用正則表達式的強大功能:

s/^manufacturer=\w+/manufacturer=XXX/ig 
+0

謝謝艾丹。你爲什麼在製造商面前拿到'^'? – Triple777er

+0

'^'是一個匹配字符串開始的零寬度斷言。 – TLP

+0

呵呵我喜歡*「利用正則表達式的全部力量」* – Borodin

4

我會寫這是這樣的

s/^manufacturer=\K.+/XXX/ 

^開頭可以確保manufacturer=從字符串的開頭開始,而不是隻出現在任何地方。

\K(對於保持)元字符表示忽略所有的在取代前的東西,所以圖案匹配^manufacturer=.+但僅.+被替換。

最後,.+匹配直到字符串末尾或尾隨換行符(.與換行符不匹配)的所有內容。

+0

我不知道'\ K'。很有用,謝謝。 – aidan

相關問題