jak mogę echo $ coś >> file.txt bez powrotu karetki?

81

Kiedy I echo $something >> file.txt, nowa linia zostanie dołączona do pliku.

Co jeśli chcę dołączyć bez nowej linii?

onemach
źródło
3
Bądź ostrożny echo $something, jego zachowanie zależy od IFSzmiennej, a możesz skończyć z znikaniem postaci. Możesz spróbować wykonać następujące czynności: var="hello world"; echo $var(dwie spacje między witaniem a światem) lub var="hello world"; IFS='l'; echo $varlub var="-e hello \\n world"; echo $var. Aby rozwiązać ten problem, umieść podwójne cudzysłowy wokół zmiennej w ten sposób: echo "$var"lub użyj printf.
jfg956

Odpowiedzi:

96

Po to echo -njest.

Ignacio Vazquez-Abrams
źródło
4
Czy istnieje odpowiednik dla cat? (np. gdy masz plik something.txtzamiast zmiennej $something)
cboettig
1
@cboettig: Nie. Użyj innego narzędzia, aby wydrukować wszystko oprócz ostatniej nowej linii.
Ignacio Vazquez-Abrams,
@ cboettig, cat domyślnie niczego nie dodaje do danych wyjściowych, więc nie ma potrzeby stosowania parametru -n dla cat. np. jeśli twój plik nie ma końca linii w ostatnim wierszu, to monit powłoki zostanie wydrukowany zaraz po ostatnim znaku pliku, a nie w nowym wierszu
Rondo
41

printfjest bardzo elastyczny i bardziej przenośny niż echo. Podobnie jak implementacje C / Perl / itp., Jeśli nie przerwiesz łańcucha formatu, \nwtedy nie zostanie wydrukowany znak nowej linii:

printf "%s" "$something" >> file.txt
Glenn Jackman
źródło
7

Jeśli używasz danych wyjściowych polecenia, możesz używać xargs w połączeniu z echo

/sbin/ip route|awk '/default/ { print $3 }' | xargs echo -n >> /etc/hosts
zainengineer
źródło
0

tr to kolejna alternatywa.

Jeśli używasz echojako danych wejściowych, możesz uciec, które tr -d '\n'.

Ta technika działa również w przypadku przesyłania strumieniowego danych wyjściowych z innych poleceń (tylko z jednym wierszem danych wyjściowych). Ponadto, jeśli nie wiesz, czy pliki mają końcówki linii UNIX lub DOS, możesz użyć tr -d '\n\r'.

Oto kilka testów pokazujących, że to działa.

Newline zawiera:

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

Nowa linia UNIX:

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

Styl DOS:

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

Testowane z BSD tri GNU tr.

Nic Doye
źródło