2013-07-03 49 views
2

我嘗試用perl編寫一個簡單的東西,該文件穿過文件夾中的一堆文本文件並刪除每個不包含任何編號的行3000個不同的數字。刪除與大量短語中的任何短語相匹配的文本文件中的行

爲了得到它開始,我試圖

perl -ni.bak -e "print if /315879|315861|313956/" sometextfile.txt 

能正常工作至今。現在的問題是,它不應該只測試三個數字,而應該測試大約3000個。當我把它們全部放在上面的正則表達式中時,它似乎在某個點之後被截斷,而不是每個數字都被搜索到。

我該如何解決這個問題?

雖然我們已經在它,我怎麼可以遍歷該文件夾中的所有* .txt文件?

+0

'3000不同號碼',你正在使用一堆'|'。我認爲正則表達式的長度可能有一些限制。因此,您可能需要通過使用字符類來優化它,例如:'1 [1-8]'而不是'11 | 12 | 13 | 14 | 15 | 16 | 17 | 18'。 – HamZa

+0

謝謝,好主意,我會繼續努力......數字當然有一些模式。 – Dirk

+3

'grep -f numbers.txt * .txt'? – TLP

回答

3

您的3000數字列表應該在實際Perl程序/腳本的上下文中正常工作。

但是,在你的問題中,你將它顯示爲從shell提示符在命令行上運行的單線程,這意味着你的shell在將它交給Perl解釋器之前會截斷這一行。我不知道現代炮彈的典型最大線長度是多少,但是3000個六位數字加上正則表達式替換的管道長度可以達到21,000個字符,這可能會比大多數shell默認允許的時間長。

+0

是的,這似乎是重點。我試圖從shell提示符運行它,目前我在Windows 7下使用Strawberry Perl。 我是否應該將帶有長正則表達式的命令放入腳本中,並且只從shell中運行此腳本?如果是這樣,那麼如何在文件編輯中獲得「-ni.bak」? – Dirk

+0

@Dirk:我找不到解釋它的文檔,但「就地編輯」實際工作的方式是創建一個新文件,然後當它完成運行時,它將原始文件重命名爲「original」。 bak「並將新文件重命名爲」original「。您可以使用'rename'命令在您自己的腳本中執行此操作。 –

1

好的,這絕對不是一個perl問題,而是關於你使用的命令shell。有一個關於限制的微軟官方文章在Windows系統上: http://support.microsoft.com/kb/830473/en-us

然而,Unix/Linux系統似乎有關的最大參數長度少了很多限制(仍取決於實際的內核或什麼的,你可以發現,在Google上)。當我將我的代碼傳遞給運行MacOS的朋友時,他沒有任何問題將其粘貼到他的shell中並正確運行。

所以我的解決方案是獲得一些實時Linux發行版,並在那裏完成這項工作。不漂亮,但這會爲我工作。儘管如此,如果有人發現可以在Windows下使用的解決方案,我將不勝感激,以滿足未來的需求。

謝謝大家。

相關問題