Ich benutze es schon seit sed
einiger Zeit, aber hier ist eine Eigenart, mit der ich herumgekommen bin und die ich nicht lösen kann.
Lassen Sie mich mein Problem mit dem tatsächlichen Fall erklären.
Szene 1
printf "ls" | xclip -selection clipboard
echo "ls" | xclip -selection clipboard
Im ersten Befehl leite ich die printf
Ausgabe an weiter, xclip
damit sie in die Zwischenablage kopiert wird. Im printf
Gegensatz dazu echo
wird jetzt standardmäßig keine neue Zeile am Ende eingefügt. Wenn ich diesen Inhalt in das Terminal ls
einfüge, wird der kopierte Befehl nicht automatisch ausgeführt.
In der zweiten Zeile befindet sich am Ende eine neue Zeile. Wenn Sie also den Inhalt der Zwischenablage einfügen, wird der Befehl auch in der Zwischenablage ausgeführt.
Das ist für mich unerwünscht. Also wollte ich die neue Zeile mit entfernen sed
, aber es schlug fehl, wie in der folgenden Szene erläutert.
Szene 2
echo "ls" | sed -r 's/\n//g' | xclip -selection clipboard
Der Inhalt in der Zwischenablage enthält weiterhin Zeilenumbrüche. Wenn ich es in das Terminal einfüge, wird der Befehl automatisch ausgeführt.
Ich habe auch versucht, das Wagenrücklaufzeichen zu entfernen \r
. Aber nada. Es scheint, dass mir hier etwas sehr Entscheidendes / Grundlegendes fehlt.
generate-text | xclip
Fall häufig nicht erwünscht sind . Diese Antwort entfernt nur den letzten Zeilenumbruch.Viele Textverarbeitungswerkzeuge, einschließlich sed, arbeiten mit dem Inhalt der Zeile, mit Ausnahme des Zeilenumbruchzeichens. Das erste, was sed bei der Verarbeitung einer Zeile tut, ist, die neue Zeile am Ende zu entfernen, dann die Befehle im Skript auszuführen und beim Ausdrucken eine letzte neue Zeile hinzuzufügen. Sie können die Newline also nicht mit sed entfernen.
Um alle Zeilenumbrüche zu entfernen, können Sie
tr
stattdessen Folgendes verwenden :quelle
Sie können Zeilenumbrüche in sed ersetzen, indem Sie die Option -z übergeben .
Sed Manpage:
quelle
| xclip
Fall im Allgemeinen nicht erwünscht ist.Wenn Sie nur Befehle in die Zwischenablage einfügen
Wenn Sie zusätzlich komplexere Transformationen vornehmen müssen,
quelle
perl
undpython
beide sind viel langsamer alssed
bei korrekter Verwendung. Das Erlernen des richtigen Gebrauchs ist jedoch der Schlüssel.sed
kann aber weit mehr als nur Ihre Einzeiler handhaben, und dies kann wahrscheinlich schneller als jedes der anderen Tools, die Sie erwähnen.Um nur die letzte neue Zeile zu entfernen, führen Sie Folgendes durch:
sed
fügt kein\0
bis zum Ende des Streams hinzu, wenn das Trennzeichen aufNUL
via gesetzt ist-z
, während beim Erstellen einer POSIX-Textdatei (definiert als Ende in a\n
) immer ein Finale\n
ohne ausgegeben wird-z
.Z.B:
Und um nicht
NUL
hinzugefügt zu beweisen :Um mehrere nachfolgende Zeilenumbrüche zu entfernen, führen Sie Folgendes durch:
quelle