Câu trả lời:
Tôi nghĩ rằng bạn đang tìm kiếm -i
:
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if SUFFIX supplied)
Ví dụ:
$ cat foo.txt
hello world
$ sed -i 's/o/X/g' foo.txt
$ cat foo.txt
hellX wXrld
Nếu bạn cung cấp một hậu tố, nó sẽ tạo một tệp sao lưu:
$ ls
foo.txt
$ sed -i.bak 's/o/X/g' foo.txt
$ ls
foo.txt foo.txt.bak
Tệp đầu vào được sửa đổi và bản sao lưu chứa dữ liệu tệp gốc được tạo.
Cũng lưu ý rằng đây là cho GNU sed
, có một số khác biệt nhỏ về định dạng giữa các sed
triển khai khác nhau .
sed
không thực hiện chỉnh sửa tại chỗ. Nó tạo ra một tập tin mới và ghi đè lên tập tin cũ, inode thay đổi.
{ rm file; cmd > file; } < file
sẽ dẫn đến kết luận rằng cmd đọc và ghi vào cùng một tệp, điều này không có. Đó là hai tập tin phân biệt có cùng tên. Nhưng tôi không muốn bắt đầu một cuộc thảo luận ở đây.
sed: 1: "foo.txt": invalid command code f
khi chạy sed -i 's/o/X/g' foo.txt
. Tuy nhiên, cung cấp một phần mở rộng, như sed -i .bak 's/o/X/g' foo.txt
hoạt động tốt. Bất kỳ ý tưởng làm thế nào để làm cho nó hoạt động mà không cần tạo tập tin sao lưu?
sed -i '' 's/o/X/g' foo.txt
Các giải pháp này hoạt động cho HPUX (UNIX):
1 .
{ rm test1.sh && awk '{gsub("Error", "NO_Error", $0); print}' > test1.sh; } < test1.sh
:
2.
perl -pi -e 's/Error/NO_Error/g' test1.sh
3.
sed 's/Error/NO_Error/g' test1.sh | tee test1.sh
-e
tùy chọn là để thực thi nhiều sed
lệnh
sed -e 's/linux/unix/' -e 's/os/OS/' file.txt
coi file.txt
như
linux os
thì O / P là
unix os
-i
tùy chọn lưu thay đổi vĩnh viễn ...
-e
lá cờ tượng trưng cho biểu. Bạn có thể muốn-i
cờ có nghĩain-place
và tôi thực sự khuyên bạn nên sử dụngsed -i.bak 's/../' filename