Làm cách nào tôi có thể nhận lệnh sed để thực hiện các thay đổi vĩnh viễn cho một tệp?


32

Điều này có thể không? Tôi đọc ở đâu đó rằng lệnh sau sẽ làm điều đó:

sed -e [lệnh] [file]

nhưng nó dường như làm điều tương tự như

sed [lệnh] [file]

(nó không lưu các thay đổi). Có cách nào để làm điều này bằng cách sử dụng sed?


2
Các -elá cờ tượng trưng cho biểu. Bạn có thể muốn -icờ có nghĩa in-placevà tôi thực sự khuyên bạn nên sử dụng sed -i.bak 's/../' filename
Valentin Bajrami

Câu trả lời:


50

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 sedtriển khai khác nhau .


4
Lưu ý rằng trang người đàn ông là sai. sedkhô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.
Marco

2
@Marco Đó là cách an toàn để chỉnh sửa một tập tin tại chỗ. Chỉnh sửa một tập tin tại chỗ, trong một tài liệu sed trong tài liệu sed có nghĩa là tập tin gốc (như được xác định bởi tên của nó) đã được sửa đổi, chứ không phải tập tin gốc (như được xác định bởi inode của nó) được sửa đổi.
Gilles 'SO- ngừng trở nên xấu xa'

2
@Gilles Tôi hoàn toàn đồng ý rằng đây là cách ưa thích để chỉnh sửa tệp, nhưng tôi hầu như không gọi nó tại chỗ . Nhưng điều đó dẫn đến câu hỏi làm thế nào một tập tin được xác định, bằng inode hoặc theo tên. Tôi sẽ nói bằng inode, nếu không thì { rm file; cmd > file; } < filesẽ 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.
Marco

Trên macOS 10.14 tôi nhận được sed: 1: "foo.txt": invalid command code fkhi 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.txthoạ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?
Joshua Pinter

1
Được rồi, tìm ra nó. Trong macOS, bạn cần thêm một chuỗi trống cho tùy chọn param mở rộng:sed -i '' 's/o/X/g' foo.txt
Joshua Pinter

2

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


Bạn không thể sử dụng tee askubfox.com/a/752451
Steven Penny

1

-etùy chọn là để thực thi nhiều sedlệnh

sed -e 's/linux/unix/' -e 's/os/OS/' file.txt

coi file.txtnhư

linux os

thì O / P là

unix os

-i tùy chọn lưu thay đổi vĩnh viễn ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.