Wie kann ich mehrzeilige Ausgaben in derselben Zeile drucken?

13

Gibt es eine Methode zum Drucken der mehrzeiligen Ausgabe (Einzelausgabe) in derselben Zeile?

Wenn die Ausgabe beispielsweise lautet:

abc
def
qwerty

Kann gedruckt werden:

abcdefqwerty 
    
Shrinidhi Kulkarni 22.12.2017, 14:54

8 Antworten

12

Mit tr -d können Sie alle Vorkommen von Zeichen aus einer gegebenen Gruppe entfernen. Um das Zeilenvorschubzeichen zu entfernen, verwenden Sie:

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 die letzte neue Zeile beibehalten möchten, fügen Sie sie einfach mit echo oder printf '\n' hinzu, e. g.:

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

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, auch die letzten, entfernt. Möglicherweise 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 22.12.2017 15:03
7

Sie können Ihre mehrzeilige Ausgabe über awk

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

oder verwenden Sie 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

Weitere Informationen: Zeilenumbruch mit AWK · serverfault.SE entfernen

    
dessert 22.12.2017 15:02
4

Auch your_command | paste -sd '' , der die nachfolgende Zeile beibehält.

    
glenn jackman 23.12.2017 00:53
2

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

perl -pe chomp

Einige 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 tun . Sie können jedoch stattdessen auf diesen Befehl umleiten oder umleiten. (Diese Fähigkeiten - und diese Einschränkung - gelten auch für jede andere auf perl -p oder perl -n basierende Lösung.)

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

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 Zeilenende angezeigt, da Perl dies verwendet, um zu entscheiden, 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 letzte Zeile möglicherweise eine hat oder nicht).

Leistung ist nicht unbedingt der Hauptgrund, um chomp zu bevorzugen. Der Befehl perl in terdons Antwort wäre nur etwas langsamer, wenn Sie keine sehr großen Dateien mit sehr langen Zeilen verarbeiten. Und wenn Sie Geschwindigkeit brauchen, ist der Weg von David Foerster wahrscheinlich noch schneller. chomp ist jedoch genau das richtige Werkzeug, wenn Sie Perl verwenden, und ich denke, dass die Absicht von chomp klarer ist als die von s/\n// . Letztlich gibt es wahrscheinlich keine objektive Antwort darauf, was besser ist.

Endgültige neue Zeile drucken.

Allerdings empfehle ich die Verwendung der Befehlsersetzung ( $( ) ) nur, um sicherzustellen, dass ein nachlaufender Zeilenvorschub gedruckt wird. Wenn der zu bearbeitende Text nicht kurz ist, ist dies wahrscheinlich sehr langsam. Er muss den gesamten Text auf einmal sammeln und dann drucken. Dies macht es schwieriger, Ihren Befehl zu verstehen. Stattdessen können Sie wie von David Foerster vorgeschlagen ausgeführt und anschließend echo oder printf '\n' ausgeführt werden.

perl -pe chomp; echo

Wenn Sie von leiten oder (wie David Foerster zeigt) den Befehl von umleiten, können Sie ihn in { ;} einschließen, so dass die 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 an den Befehl leiten oder umleiten, da echo / printf '\n' tatsächlich keine Eingabe liest. Das heißt, das funktioniert:

some-command | perl -pe chomp; echo

Währenddessen können Sie das { ;} nicht einfach entfernen:

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

Oder wenn Sie möchten, können Sie perl dazu veranlassen, den endgültigen Zeilenumbruch selbst zu drucken. Wenn Sie die Befehle perl und echo in { ;} einschließen, funktioniert dieser Ansatz auch, wenn Sie von über ihn ableiten oder umleiten (und wie all geht näher, dies funktioniert, wenn Sie auch zu weiterleiten):

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

Beachten Sie, dass der Befehl in der Antwort von terdon auch bei diesen Druckmethoden für den letzten Zeilenumbruch gut funktioniert. Zum Beispiel:

perl -pe 's/\n//'; echo
perl -pe 's/\n//; END { print "\n" }'
    
Eliah Kagan 17.03.2018 17:48
1

Verwenden Sie nur Shell:

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

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

Wenn Sie cat myfile.txt eingeben, wird Folgendes angezeigt:

abc
def
ghi

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

abc def ghi

Beachten Sie, dass bei dieser Methode ein Leerzeichen eingefügt wird, in dem zuvor neue Zeilen vorhanden waren. Dies macht die Ausgabe leichter lesbar, hält sich aber nicht strikt an Ihren Fragenbereich.

    
WinEunuuchs2Unix 17.03.2018 20:24
0

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

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

Ergebnis:

line1 line2

Der erste Befehl wandelt die mehrzeilige Ausgabe in ein Array um, der zweite Befehl erweitert Array in mehrere Argumente in einer Zeile.

    
osexp2003 03.07.2018 09:13