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?


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.


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

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

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.