2012-06-14 2 views
2

У меня есть огромная java-кодовая база (более 10 000 классов Java), которая широко использует CORBA (при ее использовании нет документации).Извлеките уникальные строки из файлов (с рисунком) рекурсивно из каталога/подкаталогов

В качестве первого шага, чтобы выяснить использование CORBA, я решил отсканировать всю кодовую базу и извлечь/распечатать уникальные строки, которые содержат шаблон «org.omg.CORBA». Обычно они содержатся в операторах импорта (например, import org.omg.CORBA.x.y.z).

Я новичок в Perl и хочу знать, есть ли способ извлечь эти данные в ОС Windows. Мне нужно иметь возможность сканировать все папки (и подпапки), в которых есть классы Java.

+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-один-лайнер, чтобы сделать это:

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

Этой первую проверку, если строка соответствует, а затем, если он еще не видел его раньше печатает строку. Это делается для всех указанных файлов (в данном случае «*»).

2

Я не хочу быть противоположным, но я не уверен, что perl - лучшее решение здесь. Предложение nhahtdh по использованию cygwin является хорошим. grep или find действительно то, что вы хотите. использование perl в этом случае будет включать использование File::Find, а затем открытие дескриптора файла для каждого файла. это, безусловно, умело, но, если возможно, я предлагаю использовать правильный инструмент для работы.

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

Если вы действительно должны использовать perl для этой работы, мы можем обработать файл :: Найти код.

Смежные вопросы