2010-11-08 26 views
9

Tôi đang sử dụng sed để thay thế một dòng bằng NULL trong một tệp. Lệnh tôi đã sử dụng làtùy chọn sed -i không hoạt động trên solaris

sed -i "s/.*shayam.*//g" FILE 

Điều này hoạt động tốt trong linux. shayam được thay thế bằng trống trong FILE. Nhưng khi tôi sử dụng trong solaris nó được hiển thị một số lỗi.

sed: Tùy chọn bất hợp pháp - i

Làm thế nào để sử dụng chức năng -i sed trong solaris. Giúp đỡ một cách tử tế.

Trả lời

11

Tùy chọn -i là GNU cụ thể. Phiên bản Solaris không hỗ trợ tùy chọn này.

Bạn sẽ cần phải cài đặt phiên bản GNU, hoặc đổi tên tập tin mới hơn một tuổi:

sed 's/.shayam.//g' FILE > FILE.new && mv FILE.new FILE 
+0

Sử dụng mktemp giúp đảm bảo rằng chúng tôi không inadvertantly dẫm lên bất kỳ tập tin có tên FILE.new ... tmp = $ (mktemp) && sed -e 's /.* shayam. * // g' FILE> "$ tmp" && mv "$ tmp" FILE; rm "$ tmp" 2>/dev/null –

0

Hoặc là cat tệp hoặc thử <? Sau đó, đường ống (|) kết quả vào tệp tạm thời và nếu mọi thứ đều tốt (&&) mv tempfile vào tệp gốc.

Ví dụ:

cat my_file | sed '!A!B!' > my_temp_file && mv my_temp_file my_file 
2

sed doesn't haven an -i option.

Có thể bạn đang sử dụng một số biến thể của nhà cung cấp cụ thể là sed. Nếu bạn muốn sử dụng các tiện ích mở rộng không được chuẩn hóa của nhà cung cấp của phiên bản không chuẩn hóa cụ thể của nhà cung cấp sed, bạn cần đảm bảo rằng bạn cài đặt biến thể không chuẩn hóa cho nhà cung cấp cụ thể đó và cần đảm bảo rằng bạn gọi và không gọi phiên bản tuân thủ chuẩn của sed là một phần của môi trường hoạt động của bạn.

Lưu ý rằng như mọi khi sử dụng các tiện ích mở rộng dành riêng cho nhà cung cấp không được chuẩn hóa, hoàn toàn không đảm bảo rằng mã của bạn sẽ có thể di chuyển được, chính xác là vấn đề bạn đang gặp phải.

Trong trường hợp cụ thể này, tuy nhiên, có giải pháp tốt hơn nhiều: sử dụng đúng công cụ cho công việc. sed là trình soạn thảo luồng (đó là lý do tại sao nó là được gọi là "sed"), tức là chỉnh sửa luồng chứ không phải tệp.Nếu bạn muốn chỉnh sửa các file, sử dụng một trình soạn thảo tập tin, chẳng hạn như ed:

ed FILE <<-HERE 
    ,s/.shayam.//g 
    w 
    q 
HERE 

Xem thêm:

11

Tôi chỉ trả lời một tương tự câu hỏi sed -i + what the same option in SOLARIS, nhưng đối với những người tìm thấy chủ đề này thay thế (tôi thấy nó trong phần chủ đề liên quan):

Vấn đề chính mà tôi thấy với hầu hết các câu trả lời nhất định là nó không hoạt động nếu bạn muốn sửa đổi nhiều tệp. Câu trả lời tôi đưa ra trong chủ đề khác:

Nó không chính xác giống như sed -i, nhưng tôi đã có một vấn đề tương tự. Bạn có thể thực hiện việc này bằng cách sử dụng perl:

perl -pi -e 's/find/replace/g' file 

sao chép/di chuyển chỉ hoạt động cho các tệp đơn lẻ. nếu bạn muốn thay thế một số văn bản trên mỗi tệp trong một thư mục và thư mục con, bạn cần một cái gì đó thực hiện tại chỗ. bạn có thể làm điều này với perl và tìm thấy:

find . -exec perl -pi -e 's/find/replace/g' '{}' \; 
Các vấn đề liên quan