2016-05-19 18 views
1

Ich brauche einen schnellen und effizienten Ansatz für das folgende Problem (Ich arbeite mit vielen Dateien.) Aber zum Beispiel:grep Spiele zwischen zwei Dateien und konvertiert in Kleinbuchstaben

Ich habe zwei Dateien: file2

Hello 
Goodbye 
Salut 
Bonjour 

und file1

Hello, is it Me you're looking for? 

ich möchte jedes Wort in der Datei 2 finden, die 2 in der Datei vorhanden ist, und wandeln dann das Wort Fall zu senken.

kann ich die Wörter in einer Datei mit grep, indem Sie:

grep -f file2.txt file1.txt 

und gibt

Hello 

So, jetzt ich

hello 

so umwandeln möchten, dass die endgültige Ausgabe ist

hello, is it Me you're looking for? 

Wo, wenn ich passen mehrere Dateien:

grep -f file2.txt *_infile.txt 

Die Ausgabe wird in jeweils separaten Outfiles gespeichert werden.

Ich weiß, dass ich in Kleinbuchstaben mit etwas wie tr konvertieren kann, aber ich weiß nur, wie man das bei jeder Großschreibung tut. Ich möchte nur die Wörter zwischen zwei Dateien von Großbuchstaben in Kleinbuchstaben konvertieren.

Danke.

Antwort

1

Ich würde das Problem ein bisschen anders lösen.

Zuerst würde ich Übereinstimmungen in Grep markieren. --color=always funktioniert gut, obwohl es in der Erkennung etwas umständlich und möglicherweise unzuverlässig ist. Dann würde ich mit sed oder perl markiert Matches ändern:

grep --color=always -F -f file2.txt file1.txt | \ 
    perl -p -e 's/\x1b.*?\[K(.*?)\x1b.*?\[K/\L\1/g' 

Die kryptische RE entspricht die Färbung Escape-Sequenz vor dem Spiel, de-Färbung Escape-Sequenz direkt nach dem Spiel und fängt alles dazwischen in Gruppe 1. es dann wendet Kleinbuchstaben \L Umwandlung in das Capture an. Wahrscheinlich kann GNU sed das gleiche tun, aber wahrscheinlich ist Perl portabler.

+0

danke - ich gab dies an, aber die Ausgabe nach dem Perl-Skript ist nicht die ursprüngliche Datei mit den gewünschten Worten unkapitalisiert, sondern eher, was wie eine Mischung der ursprünglichen Text und Wingdings aussieht. Ich denke, der Perl-Befehl fügt Sonderzeichen ein – brucezepplin

+1

Es ist 'grep --color = immer', die Sonderzeichen einfügen, die als Markierungen verwendet werden. 'perl' soll sie entfernen und markierte Orte konvertieren. Ich habe die (angebliche) Mark-Sequenz aktualisiert, aber ich bin mir immer noch nicht sicher, ob es tragbar genug ist. Könnten Sie bitte 'grep --color = immer -f datei2.txt datei1.txt | ausführen Kopf -1 | hexdump' und zeigt die Ausgabe an. Vielleicht verwendet Ihr System verschiedene Escape-Sequenzen, um die Terminal-Ausgabe zu kolorieren. – user3159253

+0

fantastisch das gibt richtig aus - ich habe 'U' in' L' umgewandelt, um in Kleinbuchstaben umzuwandeln. Vielen Dank. – brucezepplin