Làm thế nào để tôi lặp lại $ một cái gì đó >> file.txt mà không cần trả lại vận chuyển?


81

Khi tôi echo $something >> file.txt, một dòng mới sẽ được thêm vào tập tin.

Nếu tôi muốn nối thêm mà không có dòng mới thì sao?


3
Hãy cẩn thận echo $something, hành vi của nó phụ thuộc vào IFSbiến số, và bạn có thể kết thúc với nhân vật biến mất. Bạn có thể thử các cách sau: var="hello world"; echo $var(hai khoảng trắng giữa hello và world) hoặc var="hello world"; IFS='l'; echo $varhoặc var="-e hello \\n world"; echo $var. Để giải quyết điều đó, hãy đặt dấu ngoặc kép xung quanh biến như thế này : echo "$var", hoặc sử dụng printf.
jfg956

Câu trả lời:


96

Đó là những gì echo -ndành cho.


4
Có tương đương cho cat? (ví dụ: khi bạn có tệp something.txtchứ không phải biến $something)
cboettig

1
@cboettig: Không. Sử dụng một công cụ khác để in mọi thứ trừ dòng mới cuối cùng.
Ignacio Vazquez-Abrams

@cboettig, mèo không thêm bất cứ thứ gì vào đầu ra theo mặc định, do đó không cần thông số '-n' cho mèo. ví dụ: nếu tệp của bạn không có dòng kết thúc ở dòng cuối cùng, thì dấu nhắc shell của bạn sẽ được in ngay sau ký tự cuối cùng của tệp chứ không phải trong một dòng mới
Rondo

41

printflà rất linh hoạt và di động hơn echo. Giống như các triển khai C / Perl / etc, nếu bạn không chấm dứt chuỗi định dạng \nthì không có dòng mới nào được in:

printf "%s" "$something" >> file.txt

7

Nếu bạn đang sử dụng đầu ra của lệnh, bạn có thể sử dụng xargs kết hợp với echo

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

0

tr là một lựa chọn khác.

Nếu bạn đang sử dụng echolàm đầu vào của bạn, bạn có thể lấy đi cái nào tr -d '\n'.

Kỹ thuật này cũng hoạt động khi đường ống đầu ra từ các lệnh khác (chỉ có một dòng đầu ra duy nhất). Hơn nữa, nếu bạn không biết liệu các tệp có kết thúc dòng UNIX hay DOS bạn có thể sử dụng hay không tr -d '\n\r'.

Dưới đây là một số thử nghiệm cho thấy rằng điều này hoạt động.

Dòng mới bao gồm:

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

Dòng mới UNIX:

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

Phong cách DOS:

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

Đã thử nghiệm với BSD trvà GNU tr.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.