Những kẻ GNU REALLY đã sai lầm khi họ giới thiệu tệp đệ quy tìm kiếm grep. grep là để tìm REs trong các tập tin và in dòng phù hợp (g/re/p nhớ?) KHÔNG cho việc tìm kiếm tập tin. Có một công cụ hoàn hảo tốt với một tên rất rõ ràng cho các tập tin FINDing. Bất cứ điều gì đã xảy ra với câu thần chú UNIX làm một việc và làm tốt điều đó?
Dù sao, dưới đây là cách bạn muốn làm những gì bạn muốn sử dụng phương pháp truyền thống UNIX (chưa được kiểm tra):
find /path/to/folder -type f -print |
while IFS= read -r file
do
awk -v old="$oldstring" -v new="$newstring" '
BEGIN{ rlength = length(old) }
rstart = index($0,old) { $0 = substr($0,rstart-1) new substr($0,rstart+rlength) }
{ print }
' "$file" > tmp &&
mv tmp "$file"
done
Không phải là bằng cách sử dụng awk/index() thay vì sed và grep bạn tránh được sự cần thiết phải thoát khỏi tất cả các metacharacters RE có thể xuất hiện trong chuỗi cũ hoặc chuỗi mới của bạn cộng với một ký tự để sử dụng làm dấu phân cách sed không thể xuất hiện trong chuỗi cũ hoặc mới của bạn và bạn không cần chạy grep kể từ khi thay thế sẽ chỉ xảy ra cho các tập tin có chứa chuỗi bạn muốn. Có nói tất cả điều đó, nếu bạn không muốn các dấu thời gian tập tin để thay đổi nếu bạn không sửa đổi các tập tin, sau đó chỉ cần làm một diff trên tmp và tập tin ban đầu trước khi làm mv hoặc ném trong một fgrep -q trước khi awk.
Lưu ý: Phần trên sẽ không hoạt động đối với tên tệp có chứa dòng mới. Nếu bạn có những điều đó thì hãy cho chúng tôi biết và chúng tôi có thể chỉ cho bạn cách xử lý chúng.
Nguồn
2013-04-11 12:53:39
Dấu ngoặc vuông có thể cần phải được thoát. Ngoài ra đôi trích dẫn mô hình sed. – phs
Bạn cũng sẽ gặp sự cố với '/' trong các mẫu của mình. Họ nên được trốn thoát. Hoặc bạn có thể sử dụng dấu phân tách khác cho lệnh 's' của bạn (ví dụ:' @ '). –