Ich habe eine ähnliche Frage gefunden:
In diesem Fall möchte ich jedoch nicht die Gesamtlänge, sondern die Anzahl der Ziffern in der Zeile überprüfen. Aus dieser Eingabe ergibt sich beispielsweise:
cdc85e24-b9e9-8802-080a-b84479e1ae82
ekodeveloper0
1795475824.1129747.1472396049615.ref
1795475824.1129747.1472396049615
967175540.1194446.1472407271491
wangxiuyan552
jveazey
xoloki
whelee
matthauck
patel3.anirudh
mischa.salle
Wie kann ich alle Zeilen mit mehr als N Ziffern löschen?
Antwort1
Da Sie Ihre Frage mit gekennzeichnet haben perl
, besteht eine Möglichkeit, dies in Perl zu tun, darin, die Tatsache auszunutzen, dass Perl tr
eine Zählung der Anzahl der ersetzten Zeichen zurückgibt. N = 13
Sie könnten also beispielsweise (unter Verwendung von ) Folgendes tun
perl -ne 'print unless tr/[0-9]/[0-9]/ > 13' file
ekodeveloper0
wangxiuyan552
jveazey
xoloki
whelee
matthauck
patel3.anirudh
mischa.salle
Ein möglicherweise konventionellerer Weg wäre, die Regex-Übereinstimmung in einem Skalarkontext auszuwerten, um eine Anzahl zu erhalten
perl -ne '$c = () = /\d/g; print unless $c > 13' file
Siehe zum BeispielGibt es eine Perl-Abkürzung zum Zählen der Anzahl der Übereinstimmungen in einer Zeichenfolge?
Antwort2
Es ist einfacher, nur Zeilen mit X odermehrZahlen. Hier ist ein Beispiel dafür, bei dem X gleich 13 ist:
sed -n 's/[0-9]/&/13p' input.txt > output.txt
Sie können dies jedoch ändern, um das Gegenteil zu erreichen. Hier ist ein Befehl, der nur Zeilen behält, dieweniger als 13Zahlen:
sed -n -e 's/[0-9]/&/13;t' -e 'p' input.txt > output.txt
Erklärung - nur Zeilen mit 13+ Zahlen drucken
sed -n 's/[0-9]/&/13p' input.txt > output.txt
Das &
Symbol im Ersetzungstext bedeutet „alles, was übereinstimmt“.
Die Nummernflagge im s
Befehl (nach dem /find/replace/
Teil) bedeutet, dass nur diese Instanz des Suchmusters ersetzt wird.
Die p
Flagge des s
Befehls bedeutet „Drucken, wenn eine Ersetzung vorgenommen wurde.“
Der -n
Schalter dient natürlich dazu, Seds Standardaktion „Drucken“ zu unterdrücken.
Erklärung - nur Zeilen mit <13 Zahlen drucken
sed -n -e 's/[0-9]/&/13;t' -e 'p' input.txt > output.txt
Der -e
Schalter ist "Ausführen"; er übergibt nur einen Befehl. Wir brauchen ihn hier, da wir mehr als einen übergeben.
Der t
Befehl überspringt die verbleibenden Befehle, wenn der letzte s
Befehl eine Ersetzung durchgeführt hat.
Der p
Befehl wird gedruckt.