2011-03-18 56 views
4

我需要更新一大組.xml文件中的單個參數。我四處閱讀,並在Windows命令行中使用一行perl,我可以一次替換一個文件,但我一直在努力讓perl一次執行所有文件。如何在文件夾中的所有文件中執行文本替換?

perl -pi.bak -e "s/(\d+\.\d+E-\d+)/2.2E-6/g;" test.xml 

這個工作,但是當我試圖將其更改爲類似

perl -pi.bak -e "s/(\d+\.\d+E-\d+)/2.2E-6/g;" *.xml 

我得到 「無法打開的* .xml:無效參數」

perl -pi.bak -e "s/(\d+\.\d+E-\d+)/2.2E-6/g;" .xml 

給我「無法打開.xml:沒有這樣的文件或目錄」

我試圖看看我是否可以從另一個Perl腳本中調用它使用g系統(),但是這似乎與使用引號有關,並且可能不是實現此目的的最佳方式。

摘要:

問題 - 我有大量的中,我要改變一個參數的.xml文件。我必須能夠在Windows機器上執行此操作,理想情況下我希望能夠實現一種解決方案,以便使我能夠在腳本中自動執行此操作,以便可以循環執行大量參數值替換(通過調用單獨的程序將.xml文件作爲替換之間的輸入)。

感謝您可以提供任何幫助。

回答

3

嘗試這種情況:

爲/ R%I(* .XML)做的perl -pi.bak -e「S /(\ d + \ d + E- \ d +。)/ 2。2E-6 /克;」%我

+0

非常感謝,這工作完美。現在去閱讀它是如何工作的。 – 2011-03-18 15:58:10

3

當我做一些這樣的,我通常使用以下模式:

ls *.xml | xargs perl -i.bak -p -e "s/<search>/<replace>/g"

在Windows上,你應該能夠使用以下模式:

for %f in (*.xml) do perl -i.bak -p -e "s/<search>/<replace>/g" "%f"

Perl 5 by Example: Using the -n and -p Options瞭解更多詳情。

+0

注意,OP遇到的問題是特定到* Windows *命令行。據推測,這不會發生在bash中。該解決方案也應適用於Windows。 – Avi 2011-03-18 13:30:47

0

find . -type f -name *.xml | xargs perl -pi.bak -e "s/(\d+\.\d+E-\d+)/2.2E-6/g;

這將通過所有文件下。(遞歸)一次匹配.XML到perl的命令,一個。

+0

爲了允許文件名中包含空格(但不是換行符),可以使用'xargs -d'\ n'' – reinierpost 2011-03-18 13:57:39

+0

當然,你需要一個工作的Unix shell,例如'bash'才能工作。 – reinierpost 2011-03-18 13:58:26

3

您可以在.cmd使用for循環。劇本是這樣的:

for %%a in (*.xml) do (
    perl -i.bak ... %%a 
) 

這裏有一個方便的cmd.exereference

+0

非常感謝您的鏈接! – 2011-03-18 16:06:12

1

use File::Find;

更新:您可以使用此一班輪:

perl -we 'use File::Find; my $dir = shift; find (sub { $_=~ /\.xml$/i and system @ARGV, $_ }, $dir)' <dir> <other-one-liner>

1

的問題是,在Windows藉口殼呢不做文件名匹配(將* .xml擴展爲擴展名爲.xml的所有文件)。

由於shell不會爲你做,所以你必須自己動手。

這是很容易在Perl做的,但它需要「內部」代碼開始之前完成,所以把它放到一個BEGIN塊:

perl -pi.bak -e "BEGIN{@ARGV=glob shift} s/(\d+\.\d+E-\d+)/2.2E-6/g;" *.xml 
相關問題