Từ dòng lệnh, bạn có thể làm:
ruby -i -pe '$_= "prepended text\n"+$_ if $. == 1' myfile
hoặc hiệu quả hơn
ruby -i -pe 'BEGIN { gets; print "prepended text\n" + $_ }; ' myfile
Đáng buồn thay, nó quay ra, các tùy chọn -i
(tại chỗ) không phải là thực sự tại chỗ, mặc dù (và cũng không phải là tùy chọn tại chỗ sed
s cho vấn đề đó) - tệp của tôi sẽ có một inode khác nhau sau khi op.
Điều đó làm tôi buồn, vì hiệu quả, tôi không thể lọc qua (thêm vào) một tệp lớn nếu tôi không có đủ dung lượng đĩa cho hai bản sao của nó.
Nó không thực sự khó khăn để làm điều đó tại chỗ, mặc dù (lọc nói chung, không chỉ cho dòng đầu tiên). Tất cả những gì bạn cần làm là:
1) đảm bảo bạn có các con trỏ đọc và ghi riêng biệt (hoặc các đối tượng Tệp riêng biệt để đọc và viết) 2) đảm bảo bạn đã đệm các phần chưa đọc mà bạn sẽ viết lại 3) cắt ngắn để tập tin ở cuối nếu hoạt động lọc của bạn nên kết thúc với một tập tin ngắn hơn
Tôi đã viết lớp bao bọc cho rằng tại https://github.org/pjump/i_rewriter.
Với nó, bạn có thể làm
Rewriter.new("myfile") do |line, index|
index == 0 ? "prepended text\n" + line : line
end
hoặc qua các nhân thực thi:
$ i_rewriter 'index == 0 ? "prepended text\n" + line : line' myfile
Sử dụng một cách cẩn thận (nó có thể bị hỏng tệp của mình nếu bị gián đoạn).
Hãy cẩn thận khi vuốt tệp. Nó không phải là giải pháp có thể mở rộng để đọc toàn bộ tệp vào bộ nhớ. –
Tôi thích điều này để nhắn tin đơn giản, cá nhân. – steve
Giải pháp tốt nhất cho trường hợp đơn giản. –