繁体   English   中英

从目录/子目录中递归地从文件(带有模式)中提取唯一行

[英]Extract unique lines from files (with a pattern) recursively from directory/subdirectories

我有一个巨大的java代码库(超过10,000个java类),它广泛使用CORBA(虽然没有关于其用法的文档)。

作为计算CORBA用法的第一步,我决定扫描整个代码库并提取/打印包含模式“ org.omg.CORBA ”的唯一行。 这些通常在import语句中(例如import org.omg.CORBA.xyz)。

我是Perl的新手,想知道我是否有办法在Windows操作系统上提取这些细节。 我需要能够扫描具有java类的所有文件夹(和子文件夹)。

你可以在一行中使用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 hash的键,这将有效地删除重复项。 最后一个语句打印出哈希中的所有唯一键。

在脚本形式中,它看起来像这样:

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;"

只是为了好玩,perl单行代码来做到这一点:

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

这首先检查一行是否匹配,然后检查它是否在打印出行之前没有看到它。 这是针对指定的所有文件(在本例中为'*')完成的。

我不是故意反对,但我不确定perl是最好的解决方案。 nhahtdh建议使用cygwin是一个很好的建议。 grep或find真的是你想要的。 在这个例子中使用perl将涉及使用File :: Find ,然后在每个文件上打开文件句柄。 这肯定是可行的,但是,如果可能的话,我建议使用正确的工具来完成工作。

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

如果你真的必须使用perl来完成这项工作,我们可以处理File :: Find代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM