Không thể làm những gì bạn muốn với sed
. Ngay cả các phiên bản sed
hỗ trợ -i
tùy chọn chỉnh sửa tệp tại chỗ thực hiện chính xác những gì bạn đã tuyên bố rõ ràng mà bạn không muốn: họ ghi vào một tệp tạm thời và sau đó đổi tên tệp. Nhưng có lẽ bạn chỉ có thể sử dụng ed
. Ví dụ, để thay đổi tất cả các lần xuất hiện của foo
để bar
trong file file.txt
, bạn có thể làm:
echo ',s/foo/bar/g; w' | tr \; '\012' | ed -s file.txt
Cú pháp tương tự sed
, nhưng chắc chắn không hoàn toàn giống nhau.
Nhưng có lẽ bạn nên xem xét lý do tại sao bạn không muốn sử dụng một tệp tạm thời được đổi tên. Ngay cả khi bạn không có -i
hỗ trợ sed
, bạn vẫn có thể dễ dàng viết một kịch bản để thực hiện công việc cho mình. Thay vì sed -i 's/foo/bar/g' file
, bạn có thể làm inline file sed 's/foo/bar/g'
. Một kịch bản như vậy là tầm thường để viết. Ví dụ:
#!/bin/sh -e
IN=$1
shift
trap 'rm -f $tmp' 0
tmp=$( mktemp )
<$IN "$@" >$tmp && cat $tmp > $IN # preserve hard links
nên là đủ cho hầu hết các sử dụng.
-i
là một tùy chọn trong gnu sed, nhưng không phải trong sed tiêu chuẩn. Tuy nhiên, nó truyền nội dung vào một tệp mới và sau đó đổi tên tệp để nó không như bạn muốn.