фильтр с помощью grep для печати, когда текст НЕ присутствует в другом файле - PullRequest
4 голосов
/ 17 сентября 2010

У меня есть фильтр linux для извлечения всех строк из проекта xcode, которые содержат локализованные строки и создают отсортированный список уникальных записей. Фильтр работает нормально и показан ниже.

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

В результате получается список строк, похожих на это

@"string1"
@"string2"
etc

Теперь мне нужно определить записи, которые не существуют в другом текстовом файле. Итак, представьте, у меня есть текстовый файл, содержащий;

@"string1"
@"string3"
etc

Результат будет @"string2", поскольку его нет в файле

Ради аргумента, файл называется list.txt

Что мне нужно добавить в мой фильтр? Я уверен, что могу сделать это с помощью grep, но мой мозг не работает!

Ответы [ 4 ]

7 голосов
/ 20 сентября 2010

простой переключатель GREP (-v) печатает обратное. Таким образом, команда будет

GREP -v -f filename1 filename2> filename3

4 голосов
/ 17 сентября 2010

Вы можете сделать:

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

Вы передаете вывод perl в grep, который использует опцию -v для инвертирования поиска и опцию -f для получения шаблона поискафайл

2 голосов
/ 17 сентября 2010

Вы можете использовать comm :

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

Также - вы можете пропустить uniq и использовать sort -u, если он доступен.

0 голосов
/ 17 сентября 2010

Возможно, стоит сделать из этого скрипт (не проверенный):

#!/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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...