2012-05-16 12 views
28

Ich bin neu, Shell Scripting und ich versuche, neue Zeile Zeichen aus jeder Zeile mit SED zu entfernen. Dies ist, was ich bisher getan habe:entfernen neue Zeile Zeichen aus eingehenden Stream mit sed

printf "{new\nto\nlinux}" | sed ':a;N;s/\n/ /g' 

entfernt nur Ist neue Zeile Zeichen. fand ich irgendwo diesen Befehl ein:

printf "{new\nto\nlinux}" | sed ':a;N;$!ba;s/\n/ /g' 

aber es gibt: "ba:. Ereignis nicht gefunden"

, wenn ich tun:

printf "{new\nto\nlinux}" | sed ':a;N;s/\n/ /g' | sed ':a;N;s/\n/ /g' 

dann gibt es eine korrekte Ausgabe, aber ich bin auf der Suche nach etwas besser, wie ich bin nicht sicher, wie viele neue Charakter, den ich bekommen, wenn ich das Skript ausführen. Der eingehende Stream stammt von echo oder printf oder einer Variablen im Skript. Vielen Dank im Voraus

+0

Die 'ba: Event nicht gefunden' Fehler von Shell ist. Hör auf, csh zu benutzen, oder entkomme dem!. –

+0

@WilliamPursell Ich muss csh nur keine anderen Optionen für mich verwenden.auf Ihren Vorschlag habe ich fallen gelassen! "printf" {new \ nto \ nlinux} "| sed ': a; N; $ ba; s/\ n// g'" auch dieser Befehl gibt nicht das richtige Ergebnis .. ich weiß, dass es viele Nachteile der Verwendung gibt csh, aber muss es aufgrund einiger Zwang verwenden :(..thanks –

+0

Sie können nicht entfernen das '!', aber Sie müssen es mit einem Backslash vorangehen. –

Antwort

64

entfernen Zeilenumbrüche, die Verwendung tr:

tr -d '\n' 

Wenn Sie jede Newline mit einem Leerzeichen ersetzt werden sollen:

tr '\n' ' ' 

Der Fehler ba: Event not found von csh kommt, und liegt daran, dass csh versucht, !ba in Ihrer Verlaufsliste zu finden. Sie können die ! entkommen und den Befehl schreiben:

sed ':a;N;$\!ba;s/\n/ /g' # Suitable for csh only!! 

aber ist das falsche Werkzeug für diese sed, und Sie wäre besser dran, eine Shell verwenden, die Strings in Anführungszeichen maßen mehr behandelt. Das heißt, beenden Sie die Verwendung von Csh und beginnen Sie mit bash.

+0

danke für Ihre Antwort, aber Sie können wir tr verwenden, um eingehenden Stream von Echo oder printf zu ändern? –

+1

tr ist ein Filter. 'printf ... | tr ...' funktioniert ganz gut. –

+0

Nein, das funktioniert immer noch nicht.Auch mit dem '$ \! ba' ist das Ergebnis 'ba: Event not found' aus einem csh-Skript – krb686

6

Dies könnte für Sie arbeiten:

printf "{new\nto\nlinux}" | paste -sd' '    
{new to linux} 

oder:

printf "{new\nto\nlinux}" | tr '\n' ' '    
{new to linux} 

oder:

printf "{new\nto\nlinux}" |sed -e ':a' -e '$!{' -e 'N' -e 'ba' -e '}' -e 's/\n/ /g' 
{new to linux} 
+2

+1: Nette Verwendung von Paste. Beachten Sie, dass die sed-Lösung hier nicht mit csh arbeiten kann, da die Regeln falsch sind und der '!'muss immer noch entkommen sein. –

+0

Yay Paste. Es braucht jedoch einen Bindestrich am Ende, um anzuzeigen, dass es von stdin lesen sollte: 'paste -sd '' -' – Jelle

+0

tr -d" \ n "lässt mich nur mit der letzten Zeile von stdin ..:/(auf Mac) –

Verwandte Themen