2012-06-14 29 views
2

我有一個廣泛使用CORBA的大型Java代碼庫(超過10,000個Java類)(儘管它的用法沒有可用文檔)。從目錄/子目錄中遞歸地提取文件(帶有模式)中的獨特行

作爲找出CORBA用法的第一步,我決定掃描整個代碼庫並提取/打印包含模式「org.omg.CORBA」的獨特行。這些通常在導入語句中(例如import org.omg.CORBA.x.y.z)。

我是Perl的新手,想知道是否有方法可以在Windows操作系統上提取這些細節。我需要能夠掃描具有Java類的所有文件夾(和子文件夾)。如果某行相匹配,然後如果它沒有打印出前行看到它

perl -lne '/org.omg.CORBA/ and (++$seen{$_}>1 or print)' * 

這首先檢查:

+0

你已經安裝了cygwin?如果你安裝了cygwin或mysysgit,你可以'grep -rl''.'遞歸搜索所有導入類的文件。 – nhahtdh

+1

我以爲你說「文件夾和子文件夾」,這意味着遞歸搜索,然後你接受一個甚至不檢查子文件夾的答案? – TLP

回答

4

您可以在一個班輪使用File::Find

perl -MFile::Find -lwe " 
    find(sub { if (-f && /\.java$/) { push @ARGV,$File::Find::name } },'.'); 
    while(<>) { /org.omg.CORBA/ && $seen{$_}++; }; 
    print for keys %seen;" 

注意這一個班輪正在使用的Windows所需要的雙引號。

這將遞歸搜索當前目錄中擴展名爲.java的文件,並將它們添加到@ARGV陣列。然後我們使用菱形運算符打開文件並搜索字符串org.omg.CORBA,如果找到該行,則將該行添加爲%seen散列的鍵,這將有效地刪除重複項。最後一條語句打印出散列中的所有唯一鍵。

在腳本的形式,它看起來是這樣的:

use strict; 
use warnings; 
use File::Find; 

find(sub { if (-f && /\.java$/) { push @ARGV,$File::Find::name } },'.'); 
my %seen; 
while(<>) { 
    /org.omg.CORBA/ && $seen{$_}++; 
} 
print "$_\n" for keys %seen;" 
+0

我意外地接受了其他答案,即使我用這個問題解決了我的問題。作爲Perl的新手,我無法在其他答案上說得太多,但是這裏提供的單行提供給我的是我正在尋找的東西。 – sanjeev

2

只是爲了好玩,一個Perl的一行來做到這一點。這是爲指定的所有文件完成的(在本例中爲'*')。

2

我並不是說要逆勢,但我不確定perl是最好的解決方案。 nhahtdh建議使用cygwin是一個不錯的選擇。 grep或find是你真正想要的。在這個例子中使用perl將涉及使用File::Find,然後在每個文件上打開一個文件句柄。這當然是可行的,但是,如果可能的話,我建議使用正確的工具來完成這項工作。

find . -name "*.java" -type f | xargs grep -l 'org.com.CORBA' | sort | uniq 

如果你真的必須使用perl來完成這項工作,我們可以處理File :: Find代碼。

相關問題