Ich möchte eine Datei basierend auf den Ergebnissen eines regulären Ausdrucks sortieren. Zum Beispiel, wenn ich die folgenden Eigenschaftsdeklarationen in Obj-C habe
@property (nonatomic, strong) id <AlbumArtDelegate, UITextFieldDelegate> *albumArtView; // 1
@property (nonatomic, strong, readonly) UIImageView *profileView; // 2
@property (nonatomic, strong, readwrite) UIButton *postFB; // 3
@property (nonatomic, assign) UIButton *saveButton; // 4
Standardmäßig werden sie in der Reihenfolge [4, 1, 2, 3] sortiert, aber ich möchte sie in der Reihenfolge der tatsächlichen Eigenschaftsnamen [1, 3, 2, 4] sortieren. Ich kann einen regulären Ausdruck schreiben, um nur den Eigenschaftsnamen herauszufiltern. Kann ich nach den Ergebnissen dieses Ausdrucks sortieren?
Gibt es ein eingebautes Unix-Tool, das dies für mich erledigt? Ich arbeite in Xcode, daher helfen VIM / Emacs-Lösungen nicht weiter.
Der Grund, warum ich dies mit einem regulären Ausdruck tun möchte, ist, dass ich meinen Sortieralgorithmus erweitern kann, um in anderen Situationen zu arbeiten. Verwenden Sie diese Option, um Methodendeklarationen, Importanweisungen usw. zu sortieren.
sort -k 5
funktioniert nicht?Antworten:
Eine allgemeine Methode zum Sortieren des Zeileninhalts nach einer beliebigen Funktion lautet wie folgt:
Hier ist ein Schlüssel, den Sie in diesem speziellen Fall verwenden können: Dieses
sed
Programm gibt die Zeile vom letzten Bezeichner bis zum Ende aus.So legen Sie diese Tasten und die ursprünglichen Zeilen nebeneinander:
Um sie zu sortieren ...
und nur das zweite Feld (die ursprüngliche Zeile) zu verlassen
Alles zusammen (Sortieren in umgekehrter Reihenfolge, es gibt also etwas zu zeigen):
→
quelle
\1 &
des Ersetzungsausdrucks des Befehls sed replace können Sie diedecls
temporäre Datei und denpaste
Aufruf überspringen . Außerdem müsste der reguläre Ausdruck so eingestellt werden, dass er nur mit dem Bezeichner übereinstimmt (das angegebene Beispiel würde fehlschlagen, wenn ein Kommentar am Ende der Zeile Bezeichner ohne Zahlen enthält).paste
die generische Lösung mit dem kleinsten Nenner. Übrigens sollte das eine Registerkarte zwischen\1
und sein&
(von hier nicht zu unterscheiden).Das obige Skript reicht für Ihre Situation aus. Eigentlich ist es genug für jede Sortierung mit einem Schlüsselfeld. Für dasselbe Skript, erweitert, lesen Sie weiter.
Das folgende Skript richtet das zu sortierende Feld als 2 ein , das Feldlayout ist jedoch recht flexibel. Sie können bei Bedarf nach mehreren Feldern sortieren, indem Sie geeignete Regex-Muster angeben und die Sortieroptionen entsprechend ändern.
Jedes Feldmuster sollte in normale
(
Klammern)
und eingeschlossen werden'single-quoted'
.Die von Ihnen bereitgestellten Muster werden durch jedes von Ihnen ausgewählte eindeutige Zeichen begrenzt.
sed
benötigt auch ein eindeutiges Trennzeichen. Das Skript verwendet Trennzeichen\x01
und\x02
. Diese Begrenzerwerte wurden ausgewählt, da sie normalerweise nicht in Textdateien angezeigt werden.Beachten Sie, dass Ihr Setup auf der Feldzusammensetzung und nicht auf Feldtrennzeichen basieren muss.
Ausgabe:
quelle
arbeitete für mich an Cygwin.
quelle
sort -k 5n ~/Temp/data
für numerische Sortierung nach Feld 5.Dies verwendet Python. Die Pythons-Syntax ist nicht gut für Einzeiler, außer dass die Bash-Shell zwei Zeilen problemlos verarbeitet und der Code doppelte Anführungszeichen für seine Zeichenfolgenkonstanten verwenden kann :-)
Mit Pythons-Sortierroutinen können Sie eine Lambda-Funktion verwenden, um den Schlüssel für die zu sortierenden Zeilen zu extrahieren (Dekorieren, Sortieren, Nicht-Dekorieren der anderen Methoden).
Der von mir verwendete reguläre Ausdruck extrahiert nur das Nicht-Leerzeichen nach dem ersten '*' - Teilstring in den Zeilen.
quelle
pythonpy
. Damit kann Ihr Code so geschrieben werden, alspy -l 'sorted(l, key=lambda x: re.search(r"\s[*](\S+)", x).group(1)) '< test_in2.txt
hätte ich keine Klammern durcheinander gebracht.Ich habe ein Perl-Skript erstellt, um genau dies zu tun. Sie können einen regulären Ausdruck eingeben, um eine Datei nach dem ersten Capture zu sortieren. Dann können Sie ein Flag setzen, um entweder einen String- oder einen numerischen Vergleich durchzuführen. Wirf dieses Codebeispiel einfach in eine .pl-Datei.
Es ist ziemlich einfach und die Logik sitzt wirklich nur in den Zeilen 20-37.
quelle