mã lệnh không hợp lệ., mặc dù thoát thời gian, sử dụng sed


187

Bị buộc phải sử dụng CVS cho một khách hàng hiện tại và địa chỉ đã thay đổi cho repo từ xa. Cách duy nhất tôi có thể tìm để thay đổi địa chỉ từ xa trong mã địa phương của mình là tìm kiếm đệ quy và thay thế.

Tuy nhiên, với lệnh sed tôi mong đợi sẽ hoạt động:

find ./ -type f -exec sed -i "s/192.168.20.1/new.domain.com/" {} \;

Tôi gặp lỗi cho mọi tệp:

sed: 1: ".//file/path ...": invalid command code .

Tôi đã cố gắng thoát khỏi các giai đoạn trong trận đấu / thay thế sed nhưng điều đó không giải quyết được gì.

Câu trả lời:


474

Nếu bạn đang dùng OS X, điều này có lẽ không liên quan gì đến lệnh sed. Trên phiên bản OSX sed, -itùy chọn mong đợi một extensionđối số để lệnh của bạn thực sự được phân tích cú pháp làm extensionđối số và đường dẫn tệp được hiểu là mã lệnh.

Hãy thử thêm -eđối số một cách rõ ràng và đưa ra ''làm đối số cho -i:

find ./ -type f -exec sed -i '' -e "s/192.168.20.1/new.domain.com/" {} \;

Xem này .


40
Nếu bạn đã dành 10 phút như tôi đã tìm thấy sự khác biệt, đó là tùy chọn -e
acheron55

9
Câu hỏi này trả lời RE error: illegal byte sequencetrên MacOS.
JonasVautherin

11
tôi đã sử dụng một chuỗi rỗng '' làm tham số cho -i và nó đã hoạt động, nhưsed -i '' 's/blah/xx/g'
Pierre Houston

25
Đối với tôi, việc thêm -esau khi -ithực hiện sedsao lưu tất cả các tệp của mình theo cách này: "foo.txt" -> "foo.txt-e". Rõ ràng những gì tôi muốn là đúng hơn -i '', tức là không sao lưu các tệp đã thay đổi.
mdup

3
Vấn đề tương tự đối với tôi. Điều này -i -ekết hợp với một findkết quả trong nhiều tập tin kết thúc bằng -e-e-e-e-e-e-e.
aspyct

39

Bạn chỉ đơn giản là quên cung cấp một đối số cho -i. Chỉ cần thay đổi -ithành -i ''.

Tất nhiên, điều đó có nghĩa là bạn không muốn các tập tin của mình được sao lưu; mặt khác cung cấp sự mở rộng của sự lựa chọn của bạn, như -i .bak.


4

Trên OS X, không có gì giúp sed tích hợp kém để trở nên đầy đủ. Giải pháp là:

brew install gnu-sed

Và sau đó sử dụng gsed thay vì sed, sẽ chỉ hoạt động như mong đợi.


1
Cảm ơn bạn cho câu trả lời này, mà đã làm việc tuyệt vời cho tôi! Hoạt động trên cả Linux và Mac, tôi thích truy cập vào một công cụ quen thuộc hơn là tìm hiểu sự khác biệt phức tạp giữa hai công cụ có liên quan chặt chẽ.
Stephen Shank

3

Có lẽ tên miền mới của bạn có chứa /? Nếu vậy, hãy thử sử dụng dấu phân cách khác hơn là /trong sed, ví dụ như #, ,vv

find ./ -type f -exec sed -i 's#192.168.20.1#new.domain.com#' {} \;

Sẽ tốt hơn nếu gửi kèm s///trong trích dẫn đơn hơn là trích dẫn kép để tránh thay thế hoặc bất kỳ hành vi bất ngờ nào khác

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.