it-swarm.com.de

Wie kann ich eine mehrzeilige Ausgabe in derselben Zeile drucken?

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 
13

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

tr -d '\n'

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

Wenn Sie den letzten Zeilenumbruch beibehalten möchten, können Sie ihn einfach mit echo oder printf '\n', e. G.:

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

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

$ 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
10
terdon

Sie können Ihre mehrzeilige Ausgabe durch awk leiten.

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 entfernen

7
dessert

Auch your_command | paste -sd '', wodurch die abschließende Newline erhalten bleibt.

4
glenn jackman

Wenn Sie Perl dafür verwenden möchten, können Sie die Funktion chomp verwenden:

_Perl -pe chomp
_

Weitere Details für Interessierte.

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

_Perl -pe chomp file1file2file3_

In einigen Fällen möchten Sie das vielleicht nicht , aber Sie können stattdessen zu diesem Befehl umleiten oder umleiten. (Diese Fähigkeiten - und diese Einschränkung - gelten auch für jede andere _Perl -p_ oder _Perl -n_-basierte Lösung.)

Wenn Sie also die Ausgabe von running verarbeiten möchten some-command:

_some-command | Perl -pe chomp_

Dies ist möglicherweise schneller als der Perl-Befehl in terdons Antwort . Zeilenumbrüche (dargestellt durch _\n_) werden in dieser Situation nur am Ende von Zeilen angezeigt, da Perl anhand dieser Zeichen festlegt, wo die einzelnen Zeilen enden. _s/\n//_ durchsucht die gesamte Zeile nach Zeilenumbrüchen, während chomp nur die Zeile am Ende entfernt (falls vorhanden, da die allerletzte Zeile möglicherweise eine hat oder nicht).

Die Leistung ist möglicherweise nicht der Hauptgrund für die Bevorzugung von chomp. Der Befehl Perl in Antwort von terdon ist nur geringfügig langsamer, es sei denn, Sie verarbeiten eine große Datei mit sehr langen Zeilen. Und wenn Sie Geschwindigkeit brauchen, ist David Foersters Weg wahrscheinlich immer noch schneller. chomp ist jedoch genau das richtige Werkzeug, wenn Sie Perl verwenden, und ich denke, die Absicht von chomp ist klarer als die von _s/\n//_. Letztendlich gibt es wahrscheinlich keine objektive Antwort, welche 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 wie von David Foerster vorgeschlagen ausführen und anschließend echo oder _printf '\n'_ ausführen.

_Perl -pe chomp; echo
_

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

_some-command | Perl -pe chomp; echo_

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

_{ Perl -pe chomp; echo; } | some-other-command_

Wenn Sie möchten, können Sie Perl auch die letzte Zeile selbst drucken lassen. Wie das Einschließen der Befehle Perl und echo in _{_ _;}_, funktioniert dieser Ansatz auch dann, wenn Sie die Pipeline weiterleiten oder umleiten von (und, wie alle Ansätze, das funktioniert, wenn Sie Piping z es 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. Zum Beispiel:

_Perl -pe 's/\n//'; echo
_
_Perl -pe 's/\n//; END { print "\n" }'
_
2
Eliah Kagan

Verwendung nur mit der Shell:

while IFS= read -r line || [ -n "$line" ]; do printf "%s"  "$line"; done < inputfile.txt
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 cat myfile.txt eingeben, sehen Sie:

abc
def
ghi

Wenn Sie jedoch echo $(cat myfile.txt) eingeben, wird Folgendes angezeigt:

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.

1

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

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

Ergebnis:

line1 line2

Der erste Befehl verwandelt mehrzeilige Ausgaben in ein Array, der zweite Befehl erweitert das Array in mehrere Argumente in einer Zeile.

0
osexp2003