Wie kann ich die Reihenfolge von mehrzeiligen Textabschnitten umkehren, die durch leere Zeilenumbrüche / Zeilenumbrüche getrennt sind?

1228
XP1

So kehren Sie die Reihenfolge von mehrzeiligen Textabschnitten um, die durch leere Zeilenumbrüche / Zeilenumbrüche getrennt sind ...

... mit einem einfachen Befehl oder einer Anwendung, vorzugsweise ohne Programmierung?

Ich möchte keine Sortierung, sondern nur eine umgekehrte Reihenfolge der Textabschnitte.

Zum Beispiel:

A B  0 1  X YX Y  HTTP FTP 

wird

HTTP FTP  X YX Y  0 1  A B 
2
Entschuldigung, dass ich noch keine Antworten angenommen habe. Ich war eine Weile weg. Ich habe die Lösung von Peth akzeptiert, weil sie die einfachste ist. Ich habe alle funktionierenden Lösungen auf den neuesten Stand gebracht. Danke euch allen. XP1 vor 12 Jahren 0

3 Antworten auf die Frage

2
BigChief

Obwohl der Autor keine Programmierlösungen bevorzugt, ist die Verwendung von Python in einer Zeile ziemlich einfach:

open('output.txt', 'w').write('\n\n'.join(reversed(open('input.txt', 'r').read().split('\n\n')))) 

Ersetzen Sie offensichtlich input.txtund output.txtmit den gewünschten Dateien und wechseln Sie \nzu \r\nfür Windows-formatierten Textdateien.

Legen Sie dies in eine .pyDatei und rufen Sie es über auf python myscript.py.

+1, ich mag den Einzeiler. Python erlaubt wirklich cooles Zeug Siim K vor 12 Jahren 0
2
peth

tacakzeptiert ein Trennzeichen, so bashkönnen Sie zB Folgendes tun:

tac -s $'\n\n' foo 

Dies führt zu einer geringfügig falschen Ausgabe, da der letzte Absatz nicht durch einen doppelten Zeilenvorschub abgeschlossen wird. So,

(cat foo; echo) | tac -s $'\n\n' | sed '$d' 

ist wahrscheinlich was du willst. (Inhalt foound Zeilenvorschub durchleiten tacund dann seddie letzte Zeile entfernen .)

Hinweis: Leiten Sie dies nicht > fooerneut um, da Sie sonst eine leere Datei erhalten.

+1. Es klappt. Zur späteren Verwendung ist "foo" der Dateiname. Zur Ausgabe in eine Datei habe ich sie mit diesem Befehl in eine neue Datei umgeleitet: "(cat foo; echo) | tac -s $ '\ n \ n' | sed '$ d'> foo1.txt". XP1 vor 12 Jahren 0
1
Siim K

Wenn Sie Windows verwenden, können Sie Powershell verwenden. Dadurch wird der Inhalt umgekehrt test.txtund das Ergebnis wird gespeichert in test2.txt:

$f=Get-Content c:\folder\test.txt [array]::Reverse($f) $f | out-file c:\folder\test2.txt 

Aktualisieren:

Dies sollte den Trick ausführen (liest alle Zeilen aus test.txtund ordnet sie in test2.txtder gewünschten Weise neu an ):

$content = [System.IO.File]::ReadAllLines("C:\Folder\test.txt") $a = New-Object System.Collections.ArrayList $i=0 ForEach ($line in $content) else {$a.insert(0, $line); $i=0}} $a | out-file C:\Folder\test2.txt 

Wahrscheinlich nicht der eleganteste Weg, aber es hat die Arbeit mit Ihrem Testfall gemacht.

Leider kehrt der Befehl auch die Reihenfolge der einzelnen Zeilen innerhalb der Textabschnitte um, was ich nicht will. Beispielsweise wird die Reihenfolge für "A, B" zu "B, A", wobei das Komma und das Leerzeichen eine neue Zeile sind. XP1 vor 12 Jahren 0
@ XP1: Ich gehe also davon aus, dass es Windows ist? BigChief vor 12 Jahren 0
@ BigChief, ich bin unter Windows Vista, akzeptiere aber Lösungen für Windows- oder GNU / Linux-basierte Betriebssysteme. Obwohl ich sagte, dass ich eine Lösung ohne Programmierung vorziehen möchte, akzeptiere ich die Programmierung, solange die Lösung einfach ist (z. B. ein 1-Liner oder ein paar Zeilen). XP1 vor 12 Jahren 0
@ XP1: Entschuldigung, gestern habe ich die ursprüngliche Frage falsch gelesen. Siim K vor 12 Jahren 0