Cảnh báo: đây là một phương pháp nguy hiểm! Nó lạm dụng bộ đệm i / o trong linux và với các tùy chọn cụ thể của bộ đệm, nó quản lý để làm việc trên các tệp nhỏ. Đó là một sự tò mò thú vị. Nhưng đừng sử dụng nó cho một tình huống thực tế!
Bên cạnh -i
tùy chọn của sed
bạn có thể sử dụng tee
tiện ích .
Từ man
:
tee - đọc từ đầu vào tiêu chuẩn và ghi vào đầu ra và tập tin tiêu chuẩn
Vì vậy, giải pháp sẽ là:
sed s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html | tee | tee index.html
- ở đây tee
được lặp lại để đảm bảo rằng đường ống được đệm. Sau đó, tất cả các lệnh trong đường ống bị chặn cho đến khi chúng nhận được một số đầu vào để làm việc. Mỗi lệnh trong đường ống bắt đầu khi các lệnh ngược dòng đã ghi 1 bộ đệm byte (kích thước được xác định ở đâu đó ) vào đầu vào của lệnh. Vì vậy, lệnh cuối cùng tee index.html
, mở tệp để ghi và do đó làm trống nó, chạy sau khi đường ống ngược dòng kết thúc và đầu ra nằm trong bộ đệm trong đường ống.
Nhiều khả năng sau đây sẽ không hoạt động:
sed s/STRING_TO_REPLACE/STRING_TO_REPLACE_IT/g index.html | tee index.html
- nó sẽ chạy cả hai lệnh của đường ống cùng một lúc mà không bị chặn. (Nếu không ngăn chặn các đường ống phải vượt qua dòng byte bởi dòng thay vì đệm bằng đệm. Tương tự như khi bạn chạy cat | sed s/bar/GGG/
. Nếu không ngăn chặn nó tương tác nhiều hơn và thường đường ống chỉ 2 lệnh chạy mà không có đệm và ngăn chặn. Đường ống dài hơn được đệm.) Các tee index.html
ý chí mở tập tin để viết và nó sẽ được làm trống. Tuy nhiên, nếu bạn luôn bật bộ đệm, phiên bản thứ hai cũng sẽ hoạt động.
perl -pi -w -e 's/STRING_TO_REPLACE/REPLACE_WITH/g;' index.html