2010-09-17 5 views
4

J'ai un filtre linux pour extraire toutes les lignes d'un projet xcode qui contiennent des chaînes localisées et produire une liste triée d'entrées uniques. Le filtre fonctionne bien et est illustré ci-dessous.filtre avec grep pour imprimer lorsque le texte n'est PAS présent dans un autre fichier

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

Le résultat est une liste de chaînes ressemblant à ce

@"string1" 
@"string2" 
etc 

Ce que je dois maintenant faire est d'identifier les entrées qui n'existent pas dans un autre fichier texte. Alors imaginez que j'ai un fichier texte contenant;

@"string1" 
@"string3" 
etc 

Le résultat serait @"string2" car il ne figure pas dans le fichier

Par souci d'argument, le fichier est nommé list.txt

Que dois-je ajouter à mon filtre ? Je suis sûr que je peux le faire avec grep mais mon cerveau a échoué!

+0

question connexe: http://stackoverflow.com/questions/1688945/is-there-a-tool-to-diff-merge- sort-localizable-strings-files –

Répondre

4

Vous pouvez le faire:

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

tuyau Vous la sortie de perl-grep qui utilise l'option -v pour inverser la recherche et -f option pour obtenir le modèle de recherche de fichier

+0

Merci! Cela m'a aidé avec un autre problème - j'ai réalisé que j'ai posé la mauvaise question, je vais en créer un nouveau car ce dont j'ai réellement besoin est différent - des excuses! – Roger

2

Vous pouvez utiliser comm:

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

également - vous pouvez probablement omettre le uniq et utiliser sort -u si elle est disponible.

0

Il pourrait être utile faire un script avec ceci (non testé):

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

Appelez-le en utilisant:

$ find_missing list.txt
+0

Je ne voulais pas écrire un script pour le faire - je pourrais le faire assez facilement, mais je voulais voir comment le faire sans cela. – Roger

5

Un simple commutateur GREP (-v) imprime l'inverse. Ainsi, la commande serait

GREP -v -f filename1 filename2> filename3

Questions connexes