当文本不存在于另一个文件中时,使用grep过滤以进行打印

时间:2010-09-17 13:12:39

标签: linux perl filter grep

我有一个linux过滤器来从xcode项目中提取包含本地化字符串的所有行,并生成一个排序的唯一条目列表。过滤器工作正常,如下所示。

grep NSLocalized *.m | perl -pe 's/.*NSLocalizedString\((.+?)\,.*/$1/' | sort | uniq 

结果是一个看起来像这样的字符串列表

@"string1"
@"string2"
etc

我现在需要做的是识别另一个文本文件中不存在的条目。所以想象我有一个包含;

的文本文件
@"string1"
@"string3"
etc

结果将是@"string2",因为它不存在于文件

为了参数,该文件名为list.txt

我需要将哪些内容添加到我的过滤器中?我确信我可以用grep做到这一点,但我的大脑失败了!

4 个答案:

答案 0 :(得分:7)

一个简单的GREP开关(-v)打印反向。所以命令就是

GREP -v -f filename1 filename2> filename3

答案 1 :(得分:4)

你可以这样做:

grep NSLocalized *.m | 
perl -pe 's/.NSLocalizedString((.+?)\,./$1/' | 
grep -v -f list.txt | #ONLY ADDITION
sort |
uniq

您将perl的输出管道传输到grep正在使用-v选项反转搜索和-f选项以从文件中获取搜索模式

答案 2 :(得分:2)

您可以使用comm

... your pipeline | comm -23 - list.txt

此外 - 您可以省略uniq并使用sort -u(如果可用)。

答案 3 :(得分:0)

可能值得制作一个脚本(未经测试):

#!/usr/bin/perl

use strict; use warnings;

my %existing;

while ( <> ) {
    chomp;
    $existing{ $_ } = 1;
}

my %nonexisting;

while ( defined( my $file = glob '*.m') ) {
    open my $h, '<', $file
        or die "Cannot open '$file': $!";
    while ( my $line = <$h> ) {
        if ( my ($string) = $line =~ /NSLocalizedString\((.+?),/ ) {
            $existing{ $string } or $nonexisting{ $string } = 1;
        }
    }
}

print join("\n", sort keys %nonexisting), "\n";

使用以下方式调用它:

$ find_missing list.txt