Wie kann ich $ something >> file.txt ohne Wagenrücklauf ausgeben?

81

Wenn ich echo $something >> file.txt, wird eine neue Zeile an die Datei angehängt.

Was ist, wenn ich ohne neue Zeile anhängen möchte?

onemach
quelle
3
Seien Sie vorsichtig echo $something, sein Verhalten hängt von der IFSVariablen ab, und Sie könnten mit verschwindendem Charakter enden. Sie können Folgendes versuchen: var="hello world"; echo $var(zwei Leerzeichen zwischen Hallo und Welt) oder var="hello world"; IFS='l'; echo $varoder var="-e hello \\n world"; echo $var. Um dies zu lösen, setzen Sie die Variable in doppelte Anführungszeichen: echo "$var"oder verwenden Sie printf.
jfg956

Antworten:

96

Dafür echo -nist es da.

Ignacio Vazquez-Abrams
quelle
4
Gibt es ein Äquivalent für cat? (zB wenn Sie eine Datei something.txtanstatt einer Variablen haben $something)
cboettig
1
@cboettig: Nein. Verwenden Sie ein anderes Tool, um alles außer der letzten Zeile zu drucken.
Ignacio Vazquez-Abrams
@cboettig, cat fügt der Ausgabe standardmäßig nichts hinzu, sodass für cat kein '-n'-Parameter erforderlich ist. Wenn Ihre Datei beispielsweise in der letzten Zeile kein Zeilenende hat, wird Ihre Shell-Eingabeaufforderung direkt nach dem letzten Zeichen der Datei und nicht in einer neuen Zeile gedruckt
Rondo,
41

printfist sehr flexibel und portabler als echo. Wenn Sie wie bei den C / Perl / etc-Implementierungen die \nFormatzeichenfolge nicht mit beenden, wird kein Zeilenumbruch ausgegeben:

printf "%s" "$something" >> file.txt
Glenn Jackman
quelle
7

Wenn Sie die Ausgabe des Befehls verwenden, können Sie xargs in Kombination mit echo verwenden

/sbin/ip route|awk '/default/ { print $3 }' | xargs echo -n >> /etc/hosts
zainengineer
quelle
0

tr ist eine andere Alternative.

Wenn Sie echoals Ihre Eingabe verwenden, können Sie davonkommen, welche tr -d '\n'.

Diese Technik funktioniert auch, wenn die Ausgabe von anderen Befehlen weitergeleitet wird (mit nur einer einzigen Ausgabezeile). Wenn Sie nicht wissen, ob die Dateien UNIX- oder DOS-Zeilenenden haben, können Sie diese verwenden tr -d '\n\r'.

Hier sind einige Tests, die zeigen, dass dies funktioniert.

Newline enthalten:

something='0123456789' ; echo ${something} | wc -c
11

UNIX Newline:

something='0123456789' ; echo ${something} | tr -d '\n\r' | wc -c
10

DOS-Stil:

something='0123456789' ; echo ${something} | unix2dos | tr -d '\n\r' | wc -c
10

Getestet mit BSD trund GNU tr.

Nic Doye
quelle