sed - wie alles außer einem definierten Muster zu entfernen?

8

Ich muss alles außer 1, 2 oder 3 Ziffern (0-9, oder 10-99 oder 100) vor % entfernen (ich möchte aber nicht% sehen ) von der Ausgabe eines anderen Befehls und leitet sie an einen anderen Befehl weiter. Ich weiß das

%Vor%

zeigt nur die Zeile (n) an, die % enthalten, aber das möchte ich nicht. Wie kann ich den Rest des unerwünschten Textes loswerden und nur diese Zahlen übrig lassen, um sie dann zu einem anderen Befehl zu leiten?

    
octosquidopus 20.08.2011, 02:43
quelle

6 Antworten

20

Wenn Sie nicht vollständig an sed gebunden sind, ist% grep -o genau das:

%Vor%     
glenn jackman 20.08.2011 14:47
quelle
2

BEARBEITEN : Ich habe das OP falsch verstanden und eine ungültige Antwort gepostet. Ich änderte es zu einer Antwort, die, glaube ich, das Problem im allgemeineren Szenario lösen würde.

Für eine Datei wie die folgende:

%Vor%

Verwenden Sie sed -n -E 's/(^|.*[^0-9])([0-9]{1,3})%.*//p' input

%Vor%

Das Flag -n bewirkt, dass sed die automatische Ausgabe der Zeilen unterdrückt. Dann verwenden wir das Flag -E , mit dem wir erweiterte reguläre Ausdrücke verwenden können. (In GNU sed ist das Flag nicht -E , sondern -r ).

Jetzt kommt der Befehl s/// . Die Gruppe (^|.*[^0-9]) stimmt entweder mit einem Zeilenanfang ( ^ ) oder mit einer Reihe von null oder mehr Zeichen ( .* ) überein, die mit einem nicht-numerischen Zeichen enden ( [^0-9] ). [0-9]\{1,3\} entspricht nur ein bis drei Ziffern und ist an eine Gruppe gebunden (durch die Gruppenbegrenzer ( und ) ), wenn der Gruppe (^|.*[^0-9]) und gefolgt von % vorangestellt ist. Dann stimmt .* mit allem vor und nach diesem Muster überein. Danach ersetzen wir alles durch die zweite Gruppe ( ([0-9]{1,3}) ) mit der Rückreferenz . Da wir -n an sed übergeben haben, wurde nichts gedruckt, aber wir haben das Flag p an den Befehl s/// übergeben. Das Ergebnis ist wenn die Ersetzung ausgeführt wird wird die Ergebniszeile gedruckt. Beachten Sie, dass p ein Flag von s/// ist, nicht der Befehl p , weil es direkt hinter dem letzten / steht.

    
brandizzi 20.08.2011 20:16
quelle
0

sed -e 's/[^0-9]*\([0-9]*\)%.*//' erfasst die Ziffern in einer Gruppe und da das Muster mit allem übereinstimmt (dem führenden und nachgestellten .* ) wird alles verworfen.

(mein Muster entspricht einer beliebigen Anzahl von Ziffern, da sed reguläre Ausdrücke keine praktischen Kürzel wie [0-9]{1,3} unterstützen, die Sie in Perl und anderen sehen, also habe ich mich entschieden, das Prinzip, das Ihnen wichtig war, einfach zu illustrieren) / p>

Bearbeiten: um das Zitaten zu fixieren und das führende .* durch [^0-9]* zu ersetzen, um zu vermeiden, dass die gierigen Matches die Zahlen verbrauchen. Noch einmal einfacher mit Perl, wo Sie eine nicht-gierige .?*

verwenden können     
Ben Jackson 20.08.2011 02:46
quelle
0

Hier ist mein Foto:

%Vor%

Wenn die Zeile 1-3 Ziffern gefolgt von einem% enthält, wird das% -Zeichen entfernt. Andernfalls wird die gesamte Zeile entfernt. Also für Eingaben wie

%Vor%

Es ergibt

%Vor%     
carlpett 20.08.2011 21:11
quelle
0

Verwenden Sie awk anstelle von sed .

%Vor%

Überprüfen Sie für jedes Feld, ob am Ende % sign vorhanden ist. Wenn ja, drucken Sie die Nummer. ($ i + 0 bedeutet, in Ganzzahl zu konvertieren). Minimal Regulärer Ausdruck verwendet.

    
ghostdog74 21.08.2011 03:02
quelle
0
%Vor%

Die 100% sind zu extrahieren, da ansonsten auch die Anzahl der Arten 987% (oder 123% wenn auf 1 an der 1. Position gefiltert wird) an die Ausgabe gesendet wird

    
NeronLeVelu 28.10.2013 10:24
quelle

Tags und Links