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?
Wenn Sie nicht vollständig an sed gebunden sind, ist% grep -o
genau das:
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
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.
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 Sie awk
anstelle von sed
.
Ü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.
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
Tags und Links sed