代码之家  ›  专栏  ›  技术社区  ›  Roger

当文本不在另一个文件中时,用grep筛选以打印

  •  4
  • Roger  · 技术社区  · 14 年前

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

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

    结果是一个这样的字符串列表

    @"string1"
    @"string2"
    etc
    

    我现在需要做的是识别其他文本文件中不存在的条目。所以假设我有一个文本文件,其中包含:

    @"string1"
    @"string3"
    etc
    

    结果是 @"string2" 因为它不在文件中

    为了便于论证,文件名为list.txt。

    我需要在过滤器中添加什么?我相信我可以用grep来做这个,但是我的大脑失败了!

    4 回复  |  直到 14 年前
        1
  •  4
  •   codaddict    14 年前

    你可以这样做:

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

    通过管道输出 perl grep 哪个正在使用 -v 用于反转搜索和 -f 从文件获取搜索模式的选项

        2
  •  7
  •   Konark Modi    14 年前

    一个简单的grep开关(-v)打印相反的结果。所以命令是

    grep-v-f文件名1文件名2>文件名3

        3
  •  2
  •   martin clayton egrunin    14 年前

    你可以用 comm :

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

    还有-你可以省略 uniq 和使用 sort -u 如果有的话。

        4
  •  0
  •   Sinan Ünür    14 年前

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

    #!/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