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
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
Antworten:
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 echo
oder hinzufügen printf '\n'
, zB:
cat file1 file2... | { tr -d '\n'; echo; } > output.txt
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
Sie können Ihre mehrzeilige Ausgabe weiterleiten awk
awk '{printf "%s",$0} END {print ""}'
oder benutze sed
:
sed ':a;N;$!ba;s/\n//g'
$ 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
Auch your_command | paste -sd ''
was die nachlaufende Newline schont.
Wenn Sie Perl dafür verwenden möchten, können Sie seine chomp
Funktion verwenden:
perl -pe chomp
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 -p
oder perl -n
basierte 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 chomp
entfernt 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 perl
Befehl 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. chomp
ist jedoch genau das richtige Werkzeug, wenn Sie Perl verwenden, und ich denke, die Absicht von chomp
ist klarer als die vons/\n//
. Letztendlich gibt es wahrscheinlich keine objektive Antwort darauf, was besser ist.
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 echo
oder 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 perl
die letzte Zeile selbst drucken. Wie das umschließende perl
und echo
in 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" }'
perl -wpe 'chomp; END { print "\n" }
ist der gleiche Prozess, kleiner Vorteil gegenüber dem Hinzufügen von Echo
Nur-Shell-Methode verwenden:
while IFS= read -r line || [ -n "$line" ]; do printf "%s" "$line"; done < inputfile.txt
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.
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.
printf
+cat
+perl
Combo wird viel besser über gehandhabtperl -pe 's/\n//;END{printf "\n"}' input.txt
Single-Prozess , ohne Kommandosubstitution und Anführungszeichen und ohne UUOC. Vielleicht.