Ich habe die Zeilennummer 55 in einer Textdatei, die ich kurz vor der Zeilennummer 23 in derselben Textdatei verschieben möchte. Ich weiß, dass Sie Zeilen um eine bestimmte Anzahl von Zeilen 1 , 2 nach oben verschieben können, aber ist es möglich, eine Zeile an eine andere Zeile anzuhängen oder voranzustellen, anstatt die Zeilen ausführlich nach oben oder unten in einer Textdatei zu verschieben?
Ich bin offen für Antworten mit vim, sed oder einem anderen Befehlszeilenprogramm, aber je prägnanter, desto besser
aktualisieren:
Der sed
Befehl i
fügt Text vor einer Zeile ein, die dem ähnelt, wonach ich suche, außer dass ich eine Zeile vor einer Zeile einfügen möchte
text-processing
sed
command-line
vim
text-formatting
MyWrathAcademia
quelle
quelle
ed
, haben Sie sie ausprobiert?ed
aber ich habe diese Lösungen auch verpasst, weil ich nicht weit genug nach untenAntworten:
Ein skriptfähiger Editor macht dies ziemlich einfach!
Dies sendet zwei Befehle an
ed
(Bearbeiten der benannten Dateiinput
):55m22
- Zeile 55 nach Zeile 22 verschiebenwq
- Speichern Sie die Datei wieder auf der Festplatte und beenden Sie sie.quelle
echo * | ls -l
entsprichtls -l directory1 directory2
. Warum nichtprintf '%s ' '55m22' 'wq' | ed -s input'
?ls
. Das Wort Aufteilen wird normalerweise nur von der Shell durchgeführt, aber die Shell ändert nicht, was in die Pipe gelangt. Pipes übertragen Rohdaten, es ist Sache des Zielprogramms, was damit zu tun ist. Wenn Sieed
einen Befehl pro Zeile erwarten, müssen Sie diesen angeben.22
weil derm
Befehl ove die adressierte Zeile nach der Zielzeile verschiebt und Sie wollten, dass sie vor der Zeile landet23
.\n
(Zeilenvorschub), `` (Leerzeichen),\r
(Wagenrücklauf ) angibt ) usw.?printf
Format sehen, sendet die Befehle mit einer neuen Zeile, sodassed
sie als zwei separate Befehle angezeigt werden, als ob Sieed
interaktiv ausgeführt hätten.Etwas kürzer:
quelle
ed -s input <<< $'55m22\nwq'
. Der Hauptvorteil der Verwendungex
wäre die Möglichkeit, einen einzelnen Befehl mit Pipe-Begrenzung anstelle einer Reihe von Befehlen mit Zeilenumbruch zu verwenden. Andernfalls würden Sie schreibenprintf '55m22|wq\n' | ex input
, wodurch drei Zeichen gespeichert werdenprintf '55m22\nwq\n' | ed -s input
.Es ist etwas länger
vi
als ined
:55G
... gehe zu Zeile 55dd
... lösche eine Zeile23G
... gehe zu Zeile 23P
... füge die gelöschte Zeile vor Zeile 23 einZZ
... schreibe Datei und beendequelle
vi
auch hat den:m
Befehl, gleich wieed
, so:55m22
ist auch möglich , invi
.vi
war eine Verfeinerung vonex
, die selbst eine Verfeinerung von wared
.