Nối một dòng vào một tập tin trong lệnh cat?


11

Tôi có thể làm cat file.txtđể có được nội dung của một tập tin nhưng tôi cũng muốn giải quyết một dòng cuối cùng của sự lựa chọn của riêng tôi.

Tôi đã thử đường ống (cat file.txt ; echo "My final line") |nhưng chỉ có dòng cuối cùng được thông qua đường ống. Làm thế nào tôi có thể tham gia dòng mèo và dòng cuối cùng?

Chỉnh sửa cho một điểm làm rõ: Tôi không muốn sửa đổi các tập tin chính nó. Tôi biết rằng nếu đây là trường hợp tôi có thể làm echo "My final line" >> file.txthoặc echo "My final line" | tee -a file.txtnhưng tôi chỉ cố gắng thực hiện phần bổ sung trong bối cảnh của lệnh đặc biệt này để tôi có thể kết nối file.txt"My final line".


1
Có lẽ một cái gì đó như thế echo "My final line" >> file.txtnào?
edwinksl

Tôi không muốn thực sự nối thêm dòng vào đối tượng tập tin, chỉ trong lệnh / đường ống. Tôi đã biết rằng tôi có thể nối thêm dòng >>nếu tôi muốn chỉnh sửa tệp.
DoubleBass

11
Bạn đã vô tình xóa file.txt? Đoạn ống của bạn sẽ hoạt động.
Bracken

@DoubleBass: Câu trả lời của Mathieu Mitchell là tốt hơn, vì nó không sửa đổi tệp (trong bộ nhớ hoặc trên đĩa), mà thay vào đó sử dụng một tính năng của lệnh tích hợp.
Bryan Boettcher

Câu trả lời:


30

Bạn có thể tận dụng catkhả năng đọc từ stdin kết hợp với khả năng đọc nhiều tệp để đạt được điều này.

~$ cat file.txt
Hello from file.txt

~$ echo "My final line" | cat file.txt -
Hello from file.txt
My final line

Bạn cũng có thể thêm một dòng, như vậy:

~$ echo "My final line" | cat - file.txt
My final line
Hello from file.txt

Lưu ý rằng bạn không giới hạn trong một dòng duy nhất. catsẽ đọc từ stdin cho đến khi đạt EOF. Bạn có thể chuyển đầu ra từ curl, ví dụ, để thêm hoặc nối vào đầu ra của cat.

~$ curl -s http://perdu.com | cat file.txt -
Hello from file.txt
<html><head><title>Vous Etes Perdu ?</title></head><body><h1>Perdu sur l'Internet ?</h1><h2>Pas de panique, on va vous aider</h2><strong><pre>    * <----- vous &ecirc;tes ici</pre></strong></body></html>

1
(cat file.txt ; echo "My final line") | …cũng sẽ làm điều đó. Nhưng sử dụng catcho những gì nó được thiết kế cho +1 tốt hơn.
ctrl-alt-delor

@ ctrl-alt-delor: Sub-shell cũng có nhược điểm của một quy trình bổ sung để fork tương đối đắt tiền. Hãy thử ví dụ echo "$$" "$BASHPID" | head -q -n 1 /proc/mounts - | catso với ( head -q -n 1 /proc/mounts; echo "$$" "$BASHPID" ) | cathoặc thậm chí { head -q -n 1 /proc/mounts; echo "$$" "$BASHPID"; } | cat.
David Foerster

11

Đối với phụ thêm một dòng vào một tập tin, bạn chỉ có thể sử dụng toán tử append chuyển hướng vỏ, >>(các tập tin sẽ được open(2)-ed với O_APPENDcờ):

echo 'My final line' >>file.txt

Bây giờ, nếu bạn chỉ muốn xem nội dung của tệp có dòng cuối cùng được nối thêm, tôi sẽ sử dụng catvới hai đối số:

  • Đầu tiên, tập tin của bạn rõ ràng, hãy nói file.txt
  • Đối số thứ hai sẽ là chuỗi bạn chọn và để chuyển chuỗi dưới dạng tên tệp (như catchỉ xử lý các tệp), bạn có thể tận dụng thay thế quy trình <(), sẽ trả về một mô tả tệp ( /proc/self/fd/<fd_number>).

Đặt những thứ này lại với nhau:

cat file.txt <(echo 'My final line')

Nếu bạn muốn đầu ra được phân trang, giả sử lesslà máy nhắn tin yêu thích của bạn:

less file.txt <(echo 'My final line')

<()hoạt động cho bash, nhưng nó hoạt động để làm gì? Ksh? Dấu gạch ngang?
jpaugh

1
@jpaugh ksh, zsh- Vâng, dash- Không
heemayl

Điều này sửa đổi bản gốc.
ctrl-alt-delor

11
sed -e '$aMy final line' file.txt

Từ man sedtùy chọn-e

-e script, --expression=script
    add the script to the commands to be executed

$khớp với dòng cuối cùng và anối thêm chuỗi.

Nếu bạn muốn nối vĩnh viễn dòng vào tệp, hãy sử dụng -i

-i[SUFFIX], --in-place[=SUFFIX]
    edit files in place (makes backup if SUFFIX supplied)

Thay đổi lệnh thành

sed -i -e '$aMy final line' file.txt

1
Sử dụng dấu ngoặc đơn và bạn không cần dấu gạch chéo ngược.
tự đại diện

7

Nó đã được làm rõ trong các ý kiến ​​cho câu hỏi, nhưng thêm nó một lần nữa như là một câu trả lời ở đây.

Lệnh lưu ý trong câu hỏi,

(cat file.txt ; echo "My final line") | other command

hoạt động như mong đợi - tất cả đầu ra từ lớp con được tạo bởi dấu ngoặc đơn được dẫn đến lệnh thứ hai.

Nếu tệp không kết thúc bằng một dòng mới, chuỗi được lặp lại sẽ được nối vào dòng cuối cùng - điều này là phổ biến với tất cả các giải pháp khác ở đây và có thể được giải quyết bằng cách thêm một tiếng vang (trống) khác trước đó.


1
Nếu tệp không kết thúc bằng một dòng mới, tôi sẽ sử dụng awk: awk 1 file.txt; echo "My final line". awk 1 filelà một mẹo hay để bù đắp cho việc thiếu EOL ở cuối tập tin.
muru

Nếu tệp không kết thúc bằng một dòng mới, bạn cũng có thể chỉ cần sử dụng echo "\nMy final line"mà không phải phụ thuộc vàoawk
fregante
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.