2011-11-21 31 views
14

Tôi hoàn toàn mới ở Bash nhưng tôi dường như không thể tìm cách để làm cho nó làm những gì tôi muốn.BASH: chương trình đệ quy để thay thế văn bản trong một cây các tập tin

Hãy tưởng tượng bạn có một thư mục cây với 2 tác phẩm: /top.php và /test/bottom.php

Làm thế nào để thực hiện chức năng nhìn của tôi và thay thế nói "hello" vào "bonjour" ở/đầu .php AND trong /test/bottom.php?

Cho đến nay cách duy nhất tôi đã tìm thấy để làm điều này là bằng cách gọi chức năng tương tự hai lần với một mức độ sâu khác nhau:

find ./*.php -type f -exec sed -i 's/hello/bonjour/' {} \; 
find ./*/*.php -type f -exec sed -i 's/hello/bonjour/' {} \; 

Chắc chắn có một cách đệ quy để làm điều này trong một dòng?

+0

thể bản sao của [Awk/Sed: Làm thế nào để làm một recursi ve tìm/thay thế một chuỗi?] (http://stackoverflow.com/questions/1583219/awk-sed-how-to-do-a-recursive-find-replace-of-a-string) – Pureferret

Trả lời

36

Sử dụng một mô hình thực tế cho thấy thay vì vỏ wildcard mở rộng:

find . -name '*.php' -type f -exec sed -i 's/hello/bonjour/' {} \; 
+0

Bạn đã làm việc hoàn hảo ! Tôi muốn upvote nó nếu tôi có thể nhưng tôi không có số lượng yêu cầu của danh tiếng nào được nêu ra – Audioy

+1

@Erken: Cảm ơn. Bạn nên có danh tiếng để chấp nhận câu trả lời (dấu kiểm bên dưới số phiếu bầu). Đó là phản ứng chính xác nếu nó hoạt động, anyway :-). – thiton

+0

Tuyệt vời, đã hiểu! Cảm ơn rất nhiều bạn, bạn đã nhanh chóng kinh ngạc !! oO – Audioy

-2

Sử dụng xargs và grep:

find . -type f | grep php$ | xargs -n1 -i sed -i 's/hello/bonjour/' {} 

Dưới đây là cách hoạt động:

Tìm tất cả các file trong và -delow thư mục hiện tại:

find . -type f 

Bao gồm chỉ những tệp có đuôi php:

grep php$ 

Hãy mỗi dòng và áp dụng sed với nó:

xargs -n1 -i sed -i 's/hello/bonjour/' {} 
+2

trừ khi nó không hoạt động (xem xét tên tập tin có dấu cách) – sehe

+0

Trước hết, đừng đặt dấu cách vào tên tệp của bạn! :) Thứ hai, chỉ cần trích dẫn phần "{}" và bạn sẽ ổn. –

+3

Không. Grep/xargs sẽ giết mèo con của bạn. – sehe

2

Đóng:

find -iname '*.php' -type f -exec sed -i 's/hello/bonjour/' {} \; 

Hoặc

find -iname '*.php' -type f -print0 | 
    xargs -0 sed -i 's/hello/bonjour/' 
+0

giải pháp đầu tiên bạn đưa ra không hiệu quả.Tôi đã không cố gắng thứ hai nhưng giải pháp được đưa ra bởi thiton là thẳng hơn về phía trước – Audioy

+0

@Erken: đó là bởi vì bạn có nhiều tệp trong thư mục trên cùng hơn câu hỏi được mô tả. Tìm hiểu cách trích dẫn các ký tự đại diện của bạn nếu bạn không muốn chúng mở rộng. – sehe

+0

Gotcha! Cảm ơn sehe – Audioy

Các vấn đề liên quan