Làm cách nào để nối văn bản vào tệp?


109

Cách dễ nhất để nối văn bản vào tệp trong Linux là gì?

Tôi đã xem xét câu hỏi này , nhưng câu trả lời được chấp nhận sử dụng một chương trình bổ sung ( sed) Tôi chắc rằng sẽ có một cách dễ dàng hơn với echohoặc tương tự.

Câu trả lời:


125
cat >> filename
This is text, perhaps pasted in from some other source.
Or else entered at the keyboard, doesn't matter. 
^D

Về cơ bản, bạn có thể kết xuất bất kỳ văn bản nào bạn muốn vào tệp. CTRL-D gửi tín hiệu cuối tệp, tín hiệu này kết thúc đầu vào và đưa bạn trở lại trình bao.


2
Làm cách nào để thực hiện việc này khi tệp cần quyền root?
UselesssCat

2
@UselesssCat khi có điều gì đó xảy ra "quyền bị từ chối", tôi kiểm tra lại bất kỳ lệnh nào tôi đang chạy và sau đó sử dụng sudo !!- lệnh thực thi lệnh cuối cùng với sudoprepended. Gần đây tôi phát hiện ra điều này cũng hoạt động với nanovv (do vô tình cố gắng nano nano auth...)
Sandra

nếu bạn cần sử dụng sudo hoặc sử dụng điều này trong một tập lệnh, hãy tham khảo phần theo dõi của tôi đối với câu trả lời được chấp nhận này bên dưới.
user12345

4
Tôi không biết mèo có thể được sử dụng như thế này! Giống như viết một mục nhật ký. Cũng không biết về những gì ctrl-d làm. Cảm ơn bạn!
houallet

1
@Sandra - Không sử dụng !!trước đây, tuyệt vời. Vì vậy, tôi thường làm những thứ như thế cat /var/log/apache/error.logvà bị từ chối cho phép. Điều này cũng có thể được thực hiện với một id từ lịch sử sudo !1419, ví dụ , điều này sẽ thực thi lệnh tại dòng 1419trong lịch sử là sudo.
Cyclonecode

172

Làm thế nào về:

echo "hello" >> <filename>

Việc sử dụng >>toán tử sẽ nối dữ liệu vào cuối tệp, trong khi sử dụng> sẽ ghi đè lên nội dung của tệp nếu đã tồn tại.

Bạn cũng có thể sử dụng printftheo cách tương tự:

printf "hello" >> <filename>

Lưu ý rằng nó có thể nguy hiểm khi sử dụng những thứ trên. Ví dụ: nếu bạn đã có một tệp và bạn cần nối dữ liệu vào cuối tệp và bạn quên thêm >dữ liệu cuối cùng trong tệp sẽ bị hủy. Bạn có thể thay đổi hành vi này bằng cách đặt noclobberbiến trong .bashrc:

set -o noclobber

Bây giờ khi bạn cố gắng làm, echo "hello" > file.txtbạn sẽ nhận được một cảnh báo nói rằngcannot overwrite existing file .

Để buộc ghi vào tệp, bây giờ bạn phải sử dụng cú pháp đặc biệt:

echo "hello" >| <filename>

Bạn cũng nên biết rằng theo mặc định, echothêm một ký tự dòng mới ở cuối có thể bị chặn bằng cách sử dụng -ncờ:

echo -n "hello" >> <filename>

Người giới thiệu


4
Nói chung, tôi thích điều này hơn câu trả lời được chấp nhận sử dụng cat, nhưng bạn nên cẩn thận với việc đảm bảo sử dụng >>thay vì >!
sixty4bit

@ sixty4bit - Hoàn toàn đồng ý, nhưng tôi nghĩ rằng bạn luôn phải biết mình đang làm gì khi làm việc với một vỏ hoặc nếu không bạn có thể làm điều gì đó như sudo rm -r /=)
Cyclonecode

1
tốt sudo rm -r /hơn sudo rm -rf /! ^ _ ^ Có cờ yêu cầu xác nhận trước khi ghi đè lên nội dung của tệp hiện có >không? Bí danh đó để luôn sử dụng một lá cờ như vậy có vẻ như đó sẽ là một ý tưởng hay.
sixty4bit

2
@ sixty4bit - Bạn có thể thêm set -o noclobbervào của bạn .bashrcthì bạn không thể ghi đè lên một file đang tồn tại mà không cần sử dụng cú pháp đặc biệtecho "hello" >| <filename>
Cyclonecode

bạn có thể cho một ví dụ nơi tệp được gọi, nói "myFile.txt" hay gì đó không? Tôi không chắc đó là <tên tệp> hay tên tệp trong ví dụ của bạn
bharal

24

Cách khác có thể là:

echo "text" | tee -a filename >/dev/null

Di -achúc thêm vào cuối tệp.

Nếu cần sudo, hãy sử dụng:

echo "text" | sudo tee -a filename >/dev/null

Tại sao> / dev / null ở cuối?
Quadrivium

1
>/dev/nullcuối ngăn "văn bản" được hiển thị trong bảng điều khiển của bạn.
user9869932

13

Theo dõi để trả lời được chấp nhận.

Bạn cần một cái gì đó khác ngoài CTRL-D để chỉ định phần cuối nếu sử dụng cái này trong tập lệnh . Hãy thử cái này thay thế:

cat << EOF >> filename
This is text entered via the keyboard or via a script.
EOF

Thao tác này sẽ nối văn bản vào tệp đã nêu (không bao gồm "EOF").

Nó sử dụng một tài liệu tại đây (hoặc heredoc) .

Tuy nhiên, nếu bạn cần sudo để thêm vào tệp đã nêu, bạn sẽ gặp khó khăn khi sử dụng heredoc do chuyển hướng I / O nếu bạn đang nhập trực tiếp trên dòng lệnh.

Biến thể này sẽ hoạt động khi bạn đang nhập trực tiếp trên dòng lệnh:

sudo sh -c 'cat << EOF >> filename
This is text entered via the keyboard.
EOF'

Hoặc bạn có thể sử dụng teethay thế để tránh vấn đề sudo dòng lệnh được thấy khi sử dụng heredoc với cat:

tee -a filename << EOF
This is text entered via the keyboard or via a script.
EOF

Tôi đã sử dụng cat << 'EOF' >trong nhiều năm và không biết về cat << 'EOF' >>việc nối thêm! Cảm ơn
FreeSoftwareServers
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.