Xin chào Tôi muốn thêm văn bản vào một tập tin. Ví dụ: tôi muốn thêm các tác vụ vào đầu tệp todo.txt. Tôi biết echo 'task goes here' >> todo.txt
nhưng điều đó thêm dòng vào cuối tập tin (không phải những gì tôi muốn).
Xin chào Tôi muốn thêm văn bản vào một tập tin. Ví dụ: tôi muốn thêm các tác vụ vào đầu tệp todo.txt. Tôi biết echo 'task goes here' >> todo.txt
nhưng điều đó thêm dòng vào cuối tập tin (không phải những gì tôi muốn).
Câu trả lời:
echo 'task goes here' | cat - todo.txt > temp && mv temp todo.txt
hoặc là
sed -i '1s/^/task goes here\n/' todo.txt
hoặc là
sed -i '1itask goes here' todo.txt
|
) thông báo ( echo '...'
) cat
sử dụng -
(đầu vào tiêu chuẩn) làm tệp đầu tiên và todo.txt
làm tệp thứ hai. cat
conCATenates nhiều tập tin. Gửi đầu ra ( >
) đến một tệp có tên temp
. Nếu không có lỗi ( &&
) từ cat
đó đổi tên ( mv
) temp
tệp trở lại tệp gốc ( todo.txt
).
cat
nhận được một dấu gạch chéo ngược theo nghĩa đen, nó sẽ không chuyển đổi nó thành một dòng mới. Một cái gì đó khác phải làm điều đó. Thay vì cat
, hãy thử chuyển sang hexdump -C
xem bạn có thực sự gửi dấu gạch chéo ngược và n hoặc nếu đó là một dòng mới. Bạn cũng có thể thử cat -e
hiển thị kết thúc dòng.
1
nghĩa là chỉ thực hiện lệnh tiếp theo trên dòng một của tệp và i
lệnh được chèn. Tìm trong trang man trong phần "Địa chỉ" và trong phần "Lệnh không hoặc một địa chỉ".
Một lựa chọn đơn giản hơn theo ý kiến của tôi là:
echo -e "task goes here\n$(cat todo.txt)" > todo.txt
Điều này hoạt động vì lệnh bên trong $(...)
được thực thi trước đó todo.txt
được ghi đè bằng> todo.txt
Trong khi các câu trả lời khác hoạt động tốt, tôi thấy điều này dễ nhớ hơn nhiều vì tôi sử dụng tiếng vang và tiếng mèo mỗi ngày.
EDIT: Giải pháp này là một ý tưởng rất tồi nếu có bất kỳ dấu gạch chéo ngược nào todo.txt
, bởi vì -e
tiếng vang cờ sẽ giải thích chúng. Một cách khác, dễ dàng hơn nhiều để đưa dòng mới vào chuỗi lời nói đầu là ...
echo "task goes here
$(cat todo.txt)" > todo.txt
... chỉ đơn giản là sử dụng dòng mới. Chắc chắn, nó không còn là một lớp lót nữa, nhưng thực tế nó cũng không phải là một lớp lót trước đó. Nếu bạn đang thực hiện điều này trong một tập lệnh và lo lắng về việc thụt lề (ví dụ: bạn đang thực hiện điều này bên trong một chức năng), có một vài cách giải quyết để làm cho điều này vẫn phù hợp, bao gồm nhưng không giới hạn ở:
(echo 'task goes here' && cat todo.txt) > todo.txt
echo 'task goes here'$'\n'"$(cat todo.txt)" > todo.txt
Ngoài ra, nếu bạn quan tâm đến việc liệu một dòng mới có được thêm vào cuối hay không todo.txt
, đừng sử dụng những dòng này. Chà, ngoại trừ cái thứ hai đến cái cuối cùng. Điều đó không gây rối với kết thúc.
-e
cũng chuyển đổi các chuỗi thoát bên trong todo.txt?
Có moreutils
một công cụ tốt gọi là sponge
:
echo "task goes here" | cat - todo.txt | sponge todo.txt
Nó sẽ "ngâm" STDIN và sau đó ghi vào tệp, điều đó có nghĩa là bạn không phải lo lắng về các tệp tạm thời và di chuyển chúng xung quanh.
Bạn có thể nhận được moreutils
nhiều bản phân phối Linux, thông qua apt-get install moreutils
hoặc trên OS X bằng Homebrew , với brew install moreutils
.
(echo 'ble'; cat todo.txt)
:-)
Bạn có thể sử dụng Vim trong chế độ Ex:
ex -s -c '1i|task goes here' -c x todo.txt
1
chọn dòng đầu tiên
i
chèn
x
lưu và đóng
Bạn có thể tạo một tập tin mới, tạm thời.
echo "new task" > new_todo.txt
cat todo.txt >> new_todo.txt
rm todo.txt
mv new_todo.txt todo.txt
Bạn cũng có thể sử dụng sed
hoặc awk
. Nhưng về cơ bản điều tương tự xảy ra.
new_todo.txt
được ghi một phần. Giải pháp của bạn dường như mất tập tin gốc.
rm
tệp gốc.
Nếu tệp văn bản đủ nhỏ để vừa trong bộ nhớ, bạn không phải tạo tệp tạm thời để thay thế. Bạn có thể tải tất cả vào bộ nhớ và ghi lại vào tệp.
echo "$(echo 'task goes here' | cat - todo.txt)" > todo.txt
Không thể thêm dòng vào đầu tệp mà không ghi quá toàn bộ tệp.
text=$(cat file)
. Hãy cẩn thận chỉ sử dụng văn bản, bởi vì các biến shell không phải là nhị phân sạch mywiki.wooledge.org/BashFAQ/058
Bạn không thể chèn nội dung ở đầu tệp. Điều duy nhất bạn có thể làm là thay thế nội dung hiện có hoặc chắp thêm byte sau khi kết thúc tập tin hiện tại.
Bất kỳ giải pháp nào cho câu hỏi của bạn sau đó yêu cầu một tệp tạm thời (hoặc bộ đệm) được tạo (trên bộ nhớ hoặc trên đĩa) mà cuối cùng sẽ ghi đè lên tệp gốc.
Cảnh giác với việc không mất dữ liệu bằng cách bảo quản tệp gốc trong khi tạo tệp mới, nếu hệ thống tệp xảy ra đầy trong quá trình. ví dụ:
cat <(echo task go there) todo.txt > todo.txt.new && mv todo.txt.new todo.txt
echo HOME=\"/g/Users/timregan/\" | cat - 'F:\Program Files\Git\etc\profile'
hoạt động nhưng cat <echo HOME=\"/g/Users/timregan/\" 'F:\Program Files\Git\etc\profile'
đưa ra lỗi "echo: Không có tệp hoặc thư mục như vậy"
<
và (
sẽ phá vỡ cú pháp. Hãy thửcat <(echo HOME=\"/g/Users/timregan/\") 'F:\Program Files\Git\etc\profile'
Bạn có thể sử dụng tee
:
echo 'task goes here' | cat - todo.txt | tee todo.txt
GitBash + Windows10 + Đa tuyến :
Đây là phiên bản cho phép bạn sử dụng chuỗi nhiều dòng .
##############################################
## This section for demo purpose only, ##
## So you can save entire file as ##
## whatever.sh and run it. ##
## ##
##############################################
> MY_TARGET_FILE.txt ##Make Or Clear File
echo "[STARTER_CONTENT]" >> MY_TARGET_FILE.txt
##############################################
## Below is main code:
##################################################
TARGET_FILE_VARIABLE="MY_TARGET_FILE.txt"
ADD_TO_HEAD_VARIABLE=$(cat << "HEREDOC_HEAD_TEXT"
//| +-------------------------------------+ |//
//| | | |//
//| | MESSAGE_FOR_HEAD_OF_FILE | |//
//| | | |//
//| +-------------------------------------+ |//
HEREDOC_HEAD_TEXT
)
##################################################
TAR=$TARGET_FILE_VARIABLE ##
TEX=$ADD_TO_HEAD_VARIABLE ##
echo "$TEX" | cat - $TAR > TEMP && mv TEMP $TAR ##
##################################################
## Expected contents of MY_TARGET_FILE.txt :
## //| +-------------------------------------+ |//
## //| | | |//
## //| | MESSAGE_FOR_HEAD_OF_FILE | |//
## //| | | |//
## //| +-------------------------------------+ |//
## [STARTER_CONTENT]