tìm & sed (tìm kiếm và thay thế)


26

Tôi đang sử dụng lệnh sau trên máy mac của mình:

$find . -name “*.java” -exec sed -i ’s/foo/bar/g’ {} \;

và nó dường như không có tác dụng.

Tôi có hai tệp trong thư mục kết thúc bằng .java, cả hai đều có văn bản foo trong đó. Tui bỏ lỡ điều gì vậy?

EDIT: Kết quả từ yêu cầu của ý kiến

[aafghani-03:~/test amirafghani]$ find . -name "*.java" -exec sed -i 's/foo/bar/g' {} \;
sed: 1: "./bar.java": invalid command code .
sed: 1: "./foo.java": invalid command code .

2
Đó có chính xác là những gì bạn đang chạy? Điều gì nếu bạn loại bỏ -execvà tất cả mọi thứ sau nó? Nó có in tên của các tệp Java không? (Tôi lo lắng rằng bạn đang sử dụng dấu ngoặc kép thông minh thay vì dấu ngoặc kép ASCII.)
Mikel

1
Trên thực tế, điều đó giải quyết nó, ít nhất là đối với tôi. Cả hai dấu ngoặc kép và đơn nên được thay thế bằng "', tương ứng.
Lev Levitsky

2
Báo giá thông minh (?)! .. :)
Peter.O

Những gì tôi dán là chính xác những gì tôi đang chạy. Ai đó có thể gửi một câu trả lời?
Amir Afghani

1
Lần tới xin vui lòng gửi thông báo lỗi bạn đang thấy khi bạn đặt câu hỏi. Nó sẽ tiết kiệm thời gian cho tất cả mọi người.
Mikel

Câu trả lời:


34

Trước hết, hãy đảm bảo bạn đang sử dụng các trích dẫn ascii thông thường như "'(mã ascii 0x220x27, tương ứng) trong các tập lệnh shell, vì ví dụ trong bài đăng của bạn chứa các ký tự trích dẫn không chuẩn. Nếu bạn nhìn kỹ, chúng có vẻ hơi khác. Rất có thể đây là lỗi sao chép-dán từ định dạng tài liệu văn bản phong phú như Word, OOWriter hoặc thậm chí là cửa sổ trình duyệt.

Vì bạn đang sử dụng máy Mac, rất có thể bạn có triển khai FreeBSD sed, trong trường hợp đó bạn phải viết lệnh theo cách này:

find . -name "*.java" -exec sed -i '' s/foo/bar/g {} +

(ở đây sử dụng +thay vì \;để tránh chạy một sedlời gọi cho mỗi tệp).

Trong việc thực hiện FreeBSD của sedcác -ilá cờ cần một cuộc tranh cãi: phần mở rộng của một tập tin sao lưu. Ví dụ với -i .baklệnh sẽ sao lưu file1.txtnhư file1.txt.baktrước khi thực hiện thay thế trong tệp gốc. Sử dụng một đối số trống ''có nghĩa là không sử dụng tệp sao lưu, dường như là những gì bạn muốn.

Điều tương tự trong triển khai GNU (hoặc NetBSD, OpenBSD, busybox) sẽ là:

find . -name "*.java" -exec sed -i s/foo/bar/g {} +

Cảm ơn bạn @bahamat@Mikel@ pieter-Breed đã cải thiện câu trả lời của tôi với ý kiến ​​của bạn.


Làm niềng răng làm gì?
Zane Hitchcox

3
@ZaneHitchcox niềng răng xoăn là giữ chỗ cho tên tệp phù hợp
Ngừng gây hại liên tục cho Monica
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.