2009-12-13 45 views
31

Làm cách nào để tìm và thay thế chuỗi trên dòng lệnh trong nhiều tệp trên Unix?tìm và thay thế trong nhiều tệp trên dòng lệnh

+0

thể trùng lặp của [Tìm kiếm và thay thế một thuật ngữ cụ thể trong nhiều tệp] (http://stackoverflow.com/questions/2263925/find-and-replace-a-particular-term-in-multiple-files) – Quanlong

Trả lời

41

có rất nhiều cách .Nhưng một trong những câu trả lời sẽ là:

find . -name '*.html' |xargs perl -pi -e 's/find/replace/g' 
6

tôi luôn luôn làm điều đó với kịch bản ed hoặc kịch bản cũ.

for i in "[email protected]"; do ex - "$i" << 'eof'; done 
%s/old/new/ 
x 
eof 

Các lệnh chỉ là: dòng chế độ từ vi.

+0

Điều này có lợi thế riêng biệt mà bạn có thể thực hiện các chỉnh sửa phức tạp hơn. – alastair

2

với vỏ bash gần đây, và giả sử bạn không cần phải đi qua thư mục

for file in *.txt 
do 
while read -r line 
do 
    echo ${line//find/replace} > temp   
done <"file" 
mv temp "$file" 
done 
21

Giống như các giải pháp Zombie (và nhanh hơn tôi giả sử) nhưng với sed (tiêu chuẩn trên nhiều distro và OSX) thay vì Perl:

find . -name '*.py' | xargs sed -i .bak 's/foo/bar/g' 

này sẽ thay thế tất cả foo lần xuất hiện trong các tập tin Python của bạn dưới đây thư mục hiện hành với thanh và tạo bản sao lưu cho mỗi tệp có phần mở rộng là .py.bak.

Và để loại bỏ de bak file:

find . -name "*.bak" -delete 
+0

Điều này ảnh hưởng đến khoảng trắng bên ngoài tìm kiếm. Dường như thêm dòng mới vào cuối mỗi tệp của tôi. – Shane

+0

Chỉnh sửa tại chỗ AFAIK không được hỗ trợ trong mọi phiên bản sed; Tôi nghĩ đó là một phần mở rộng của GNU. – alastair

+0

là một phần mở rộng của gnu và ít nhất trong phiên bản của tôi, nó phải là 'sed -i.bak' (không có khoảng trắng) – friedemann

4

Sử dụng tìm và sed với tên hoặc thư mục với việc sử dụng không gian này:

find . -name '*.py' -print0 | xargs -0 sed -i 's/foo/bar/g' 
Các vấn đề liên quan