Tìm và thay thế bằng sed trong thư mục và thư mục con


244

Tôi chạy lệnh này để tìm và thay thế tất cả các lần xuất hiện của 'apple' bằng 'cam' trong tất cả các tệp trong thư mục gốc của trang web của tôi:

find ./ -exec sed -i 's/apple/orange/g' {} \;

Nhưng nó không đi qua các thư mục con.

Điều gì sai với lệnh này?

Dưới đây là một số dòng đầu ra của find ./:

./index.php
./header.php
./fpd
./fpd/font
./fpd/font/desktop.ini
./fpd/font/courier.php
./fpd/font/symbol.php

bạn có thể chạy find ./và đăng một số đầu ra mẫu? Và thư mục cấu trúc xin vui lòng. chỉnh sửa: cảm ơn!
Jacob

Hừm, phát hiện của bạn là chính xác, hoạt động với tôi với các thư mục con.
Jacob

1
Làm thế nào để bạn biết nó không xử lý thư mục con?
carlpett

bởi vì nó mang lại những lỗi này: sed: không thể chỉnh sửa ./fpd: không phải là một tập tin thông thường sed: không thể chỉnh sửa ./fpd/font: không phải là một tập tin thông thường không phải là một regula
hd.

oh ... tôi grep cho táo và không tìm thấy gì. Tất cả chúng đã được thay thế. ;) cảm ơn bạn . bạn đã mở mắt của tôi !!!
hd.

Câu trả lời:


421

Tìm kiếm của bạn sẽ trông như thế để tránh gửi tên thư mục đến sed:

find ./ -type f -exec sed -i -e 's/apple/orange/g' {} \;

19
Bạn có thể cần phải thay đổi sed -i 's/apple/orange/g'để sed -i '' 's/apple/orange/g'làm cho công việc này.
paulmelnikow

7
-imất một đối số: phần mở rộng được sử dụng để lưu tệp tạm thời. Trong GNU sed, có vẻ như không có khoảng cách giữa -ivà đối số của nó, nhưng trong BSD sed có BẠC nên BSD -i '' 's/foo/bar/'tương đương với GNU -i 's/foo/bar/.
paulmelnikow

20
Trên thực tế, việc thêm vào -ekhông hoạt động trên Mac OS. touch a b c d etheo sau là lệnh trên tạo ra một danh sách thư mục như thế này : a a-e b b-e c c-e d d-e e e-e.
paulmelnikow

6
Đối với Mac OS, câu trả lời này stackoverflow.com/questions/19242275/ từ theRE error: illegal byte sequence
kakoma

3
Đối với người dùng vỏ cá, hãy nhớ trích dẫn các dấu ngoặc rỗng '{}', vì cá sẽ tự động mở rộng các dấu ngoặc rỗng nếu không được trích dẫn.
Kevin Cherepski

84

Đối với các tác vụ lớn hơn, tốt hơn và nhanh hơn là sử dụng grep và xargs, vì vậy, ví dụ;

grep -rl 'apples' /dir_to_search_under | xargs sed -i 's/apples/oranges/g'

20
Cảm ơn câu trả lời này, nó rất hữu ích! Nếu trong kho git, nó thậm chí còn sử dụng nhanh hơngit grep -l 'apples' | xargs sed -i 's/apples/oranges/g'
mrodrigues 11/07/2016

4

Điều này làm việc cho tôi:

find ./ -type f -exec sed -i '' 's#NEEDLE#REPLACEMENT#' *.php {} \;

câu hỏi ban đầu không giới hạn ở các tệp * .php, còn có một .ini
knocte

Việc không được trích dẫn *.phplà thực sự không chính xác; bạn thật may mắn vì nó không được mở rộng trong thư mục bắt đầu vì bạn không có bất kỳ tập tin phù hợp nào ở đó.
tripleee

3
grep -e apple your_site_root/**/*.* -s -l | xargs sed -i "" "s|apple|orage|"

1

Vì cũng có những người dùng macOS đọc cái này (như tôi đã làm), đoạn mã sau hoạt động với tôi (vào ngày 10.14)

egrep -rl '<pattern>' <dir> | xargs -I@ sed -i '' 's/<arg1>/<arg2>/g' @

Tất cả các câu trả lời khác sử dụng -i-ekhông hoạt động trên macOS.

Nguồn


0

Tôi nghĩ rằng chúng ta có thể làm điều này với một lệnh đơn giản

for i in `grep -rl eth0 . 2> /dev/null`; do sed -i ‘s/eth0/eth1/’ $i; done

Tham khảo trang này .


-6

Trong linuxOS:

sed -i 's/textSerch/textReplace/g' namefile

nếu "sed" không hoạt động hãy thử:

perl -i -pe 's/textSerch/textReplace/g' namefile

4
anh ta muốn tìm tất cả các tệp trong các thư mục con chứa chuỗi đó và thay thế, không chỉ một tệp duy nhất
phuclv
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.