Wie kann ich eine mehrzeilige Ausgabe in derselben Zeile drucken?

15

Gibt es eine Methode, um mehrzeilige Ausgaben (Einzelausgaben) in derselben Zeile zu drucken?

Zum Beispiel, wenn die Ausgabe ist:

abc
def
qwerty

Ist es möglich zu drucken:

abcdefqwerty 
Shrinidhi Kulkarni
quelle

Antworten:

13

Mit können Sie alle Vorkommen von Zeichen aus einer bestimmten Menge entfernen tr -d. So entfernen Sie das Zeilenumbruchzeichen:

tr -d '\n'

Wie immer können Sie die Eingabe- und Ausgabeumleitung und Pipes zum Lesen oder Schreiben von Dateien und anderen Prozessen verwenden.

Wenn Sie den letzten Zeilenumbruch behalten möchten, können Sie ihn einfach mit echooder hinzufügen printf '\n', zB:

cat file1 file2... | { tr -d '\n'; echo; } > output.txt
David Foerster
quelle
10

Viele Möglichkeiten. Zur Veranschaulichung habe ich Ihr Beispiel gespeichert in file:

$ cat file | tr -d '\n'
abcdefqwerty$ 
$ cat file | perl -pe 's/\n//'
abcdefqwerty$ 

Dadurch werden alle Zeilenumbrüche entfernt, einschließlich des letzten. Vielleicht möchten Sie stattdessen Folgendes tun:

$ printf "%s\n" "$(cat file | perl -pe 's/\n//')"
abcdefqwerty
$ printf "%s\n" "$(cat file | tr -d '\n')"
abcdefqwerty
terdon
quelle
Ich denke die printf+ cat+ perlCombo wird viel besser über gehandhabtperl -pe 's/\n//;END{printf "\n"}' input.txt Single-Prozess , ohne Kommandosubstitution und Anführungszeichen und ohne UUOC. Vielleicht.
Sergiy Kolodyazhnyy
7

Sie können Ihre mehrzeilige Ausgabe weiterleiten awk

awk '{printf "%s",$0} END {print ""}'

oder benutze sed:

sed ':a;N;$!ba;s/\n//g'

Beispiellauf

$ echo -e "1\n2\n3\n4" | awk '{printf "%s",$0} END {print ""}'
1234
$ echo -e "1\n2\n3\n4" | sed ':a;N;$!ba;s/\n//g'              
1234

Weiterführende Literatur: Zeilenumbruch mit AWK · serverfault.SE beseitigen

Dessert
quelle
4

Auch your_command | paste -sd ''was die nachlaufende Newline schont.

Glenn Jackman
quelle
2

Wenn Sie Perl dafür verwenden möchten, können Sie seine chompFunktion verwenden:

perl -pe chomp

Weitere Details für Interessierte.

Sie können einen oder mehrere Dateinamen als nachfolgende Argumente übergeben.

perl -pe chomp file1 file2 file3

In einigen Fällen möchten Sie dies möglicherweise nicht, können aber stattdessen zu diesem Befehl umleiten oder umleiten. (Diese Fähigkeiten - und diese Einschränkung - gelten auch für jede andere perl -poder perl -nbasierte Lösung.)

Wenn Sie also die Ausgabe aus dem laufenden Betrieb verarbeiten möchten some-command:

some-command | perl -pe chomp

Dies ist möglicherweise schneller als der Perl-Befehl in der Antwort von terdon . Newline-Zeichen (dargestellt durch \n) werden in dieser Situation nur am Ende von Zeilen angezeigt, da Perl damit bestimmt, wo die einzelnen Zeilen enden.s/\n//Durchsucht die gesamte Zeile nach Zeilenumbrüchen und chompentfernt nur die Zeile am Ende (falls vorhanden, da die allerletzte Zeile möglicherweise eine enthält oder nicht).

Die Leistung ist vielleicht nicht der Hauptgrund für den Vorzug chomp. Der perlBefehl in der Antwort von terdon ist nur geringfügig langsamer, wenn Sie keine große Datei mit sehr langen Zeilen verarbeiten. Und wenn Sie Geschwindigkeit brauchen, ist der Weg von David Foerster wahrscheinlich immer noch schneller. chompist jedoch genau das richtige Werkzeug, wenn Sie Perl verwenden, und ich denke, die Absicht von chompist klarer als die vons/\n// . Letztendlich gibt es wahrscheinlich keine objektive Antwort darauf, was besser ist.

Letzte Zeile drucken.

Ich empfehle jedoch, keine Befehlsersetzung ( $( )) zu verwenden, um sicherzustellen, dass eine nachgestellte Zeile gedruckt wird. Wenn der zu verarbeitende Text nicht kurz ist, ist er wahrscheinlich sehr langsam. Er muss den gesamten Text auf einmal erfassen und dann ausdrucken. Dadurch wird es schwieriger, Ihren Befehl zu verstehen. Stattdessen können Sie tun, was David Foerster vorgeschlagen hat, und dann echooder printf '\n'danach rennen .

perl -pe chomp; echo

Wenn Sie von diesem Befehl aus weiterleiten oder (wie David Foerster zeigt) von diesem Befehl umleiten , können Sie ihn { ;}so einschließen , dass die Ausgabe beider Befehle zusammengenommen wird. Wenn Sie es nur auf dem Terminal drucken, können Sie es genau wie oben gezeigt ausführen. Dies funktioniert auch, wenn Sie an den Befehl weiterleiten oder ihn umleiten , da echo/ printf '\n'tatsächlich keine Eingaben liest. Das heißt, das funktioniert:

some-command | perl -pe chomp; echo

Während hier können Sie nicht einfach entfernen { ;}:

{ perl -pe chomp; echo; } | some-other-command

Wenn Sie möchten, können Sie auch perldie letzte Zeile selbst drucken. Wie das umschließende perlund echoin Befehle { ;}, funktioniert dieser Ansatz auch wenn Sie Rohrleitungen oder Umleiten von ihm (und, wie alle Ansätze, das funktioniert , wenn Sie Rohrleitungen zu ihm, auch):

perl -wpe 'chomp; END { print "\n" }'

Beachten Sie, dass der Befehl in der Antwort von terdon auch mit diesen Methoden zum Drucken der letzten neuen Zeile gut funktioniert. Beispielsweise:

perl -pe 's/\n//'; echo
perl -pe 's/\n//; END { print "\n" }'
Eliah Kagan
quelle
perl -wpe 'chomp; END { print "\n" } ist der gleiche Prozess, kleiner Vorteil gegenüber dem Hinzufügen von Echo
Sergiy Kolodyazhnyy
1

Nur-Shell-Methode verwenden:

while IFS= read -r line || [ -n "$line" ]; do printf "%s"  "$line"; done < inputfile.txt
Sergiy Kolodyazhnyy
quelle
1

Diese Antwort enthält eine Lösung für das Problem, das Sie erstellen möchten : Warum entfernt die Bash \ n in $ (cat-Datei)?

Wenn Sie tippen cat myfile.txt, sehen Sie:

abc
def
ghi

Aber wenn Sie tippen, werden echo $(cat myfile.txt)Sie sehen:

abc def ghi

Beachten Sie, dass diese Methode ein Leerzeichen einfügt, in dem sich neue separate Zeilen befanden. Dies erleichtert das Lesen der Ausgabe, hält sich jedoch nicht strikt an Ihren Fragenumfang.

WinEunuuchs2Unix
quelle
0

Wenn Sie Bash verwenden, können Sie dies ohne externes Tool tun.

x=($(echo line1; echo line2))
echo "${x[@]}"

Ergebnis:

line1 line2

Mit dem ersten Befehl wird die mehrzeilige Ausgabe in ein Array umgewandelt, mit dem zweiten Befehl wird das Array in mehrere Argumente in einer Zeile umgewandelt.

osexp2003
quelle