2014-10-06 49 views
0

我不知道任何Perl,但我偶爾會使用「perl pie」(perl -pi -e)來執行批處理正則表達式查找和替換操作,例如,在文件夾perl -pi -e 's|a|e|g' *.txt的所有.txt文件中將a更改爲e執行前測試perl -pi -e單線程的最佳方法是什麼?

有沒有辦法做一個「空運行」,以便我可以預覽更改?我經常使用具有正面/負面看法/向後看,組參考等的中度複雜的正則表達式,並且我經常不能100%確定我在第一次運行時是否正確。這將是精彩有類似rename.pl-n標誌,它不會改變任何東西,只會輸出所做的更改。

目前,我的策略是隻使用ack,它接受一個Perl正則表達式,以確保我的匹配字符串是正確的,並從那裏開始。有沒有更好的辦法?像rename -n

如果我遺失了一些非常棒的東西,也可以打開perl以外的東西,儘管我偏愛它的正則表達式格式。

非常感謝!

回答

4

只需從您的Perl代碼中刪除-i參數即可進行空運行。

perl --help

-i[extension]  edit <> files in place (makes backup if extension supplied) 

爲了在更換髮生打印的特定線。

$ cat file 
abcd 
cbcb 
foo 
$ perl -nle 'print if s|a|e|g' file 
ebcd 
+0

感謝您的回覆,但如上所述,我只想輸出更改(而不是整個文件內容)。 – n8henrie 2014-10-07 04:38:00

+0

如果要打印發生更改的特定行,則需要添加'-n'而不是'-p'參數。 'perl -nle'打印如果s | a | e | g'文件' – 2014-10-07 06:56:57

+0

太好了,謝謝!下面通過顯示哪個文件正在匹配,使它更接近rename.pl輸出,但這肯定回答了這個問題。 'perl -ne'if(s | a | e | g){print「$ ARGV \ t」; print}'* .txt' – n8henrie 2014-10-07 16:12:25

3

兩種解決方案。

  1. 取出-i參數,以便修改後的文件打印到控制檯

  2. 指定備份擴展-i.bak,這樣你就可以觀察其變化,並恢復在必要時

無論哪種方式,我會測試沒有glob *.txt,而是在單個文件上工作,直到您確定它正常工作。

我可能傾向於使用單個文件的第二個選項。這樣你就可以輕鬆地做一個diff觀察發生的變化。

$ perl -i.bak -pe 's|a|e|g' sample.txt 
$ diff sample.txt sample.txt.bak 
+1

這與我所希望的更接近,因爲'diff'只會輸出變化。我認爲最好的答案可能是第一個和第二個解決方案的結合,'for * in * .txt; do diff <(perl -pe's | a | e | g'「$ f」)「$ f」; done' – n8henrie 2014-10-07 04:43:12

相關問題