\f
là ký tự nguồn cấp dữ liệu trong Perl. Dường như các tệp không đúng định dạng này được tạo bởi một người mới đối với cả Perl và XML.
Đây là một bản sửa lỗi trước đây - cũng đáp ứng các mục tiêu của OP là tự động cập nhật tất cả các tệp, không giống như câu trả lời được chấp nhận với sed, sẽ chỉ hoạt động trên một tệp tại một thời điểm mà nó không được ghép nối find
.
\f
chỉ có thể được sử dụng chính nó thay vì mã thập lục phân x0c
.
find . -type f -exec perl -pi.bkp -e 's [ \f ilename ][ /f ilename ]gx' {} \;
Ở đây tôi đã thêm -type f
vào tel find
để chỉ trả về các tệp đơn giản - nếu không find
sẽ trả về .
trong danh sách và kích hoạt cảnh báo khi bạn cố chỉnh sửa nó, mặc dù mọi thứ khác vẫn sẽ hoạt động.
Tôi cũng đã làm cho regex dễ nhìn hơn bằng cách sử dụng x
cờ bỏ qua khoảng trắng thực, cho phép bạn loại bỏ các phần tử của biểu thức chính quy của bạn. Nếu bạn không thích điều này, thì ở đây không có:
find . -type f -exec perl -pi.bkp -e 's[\filename][/filename]g' {} \;
Và trong trường hợp có khả năng tất cả các ký tự nguồn cấp dữ liệu là giả và tất cả phải được thay thế bằng /f
, sau đó bạn có thể làm mỏng lớp lót xuống hơn nữa:
find . -type f -exec perl -pi.bkp -e 's[\f][/f]g' {} \;
Bạn không cần phải sử dụng dấu gạch chéo về phía trước để bao quanh các phần tử của lệnh thay thế regex ( s///
) trong Perl. Bạn có thể sử dụng bất kỳ biểu tượng. Tuy nhiên, nếu bạn chọn sử dụng bất kỳ loại biểu tượng giống như khung được ghép nối nào, bạn phải sử dụng cả hai loại này: s[old][new]
ví dụ.
Vì tôi không sử dụng dấu gạch chéo, tôi không phải thoát bất kỳ dấu gạch chéo nào.
Đối với -i.bkp
: perl -pi -e
cho phép bạn chỉnh sửa tại chỗ - nhưng nếu bạn muốn có thêm bảo hiểm trong trường hợp bạn gặp lỗi chương trình Perl tìm và thay thế, bạn có thể đặt một phần mở rộng tệp để nó tạo một bản sao của các tệp gốc cho bạn. Ở đây, tôi đã sử dụng .bkp
.
Trong các phiên bản gần đây nhất của Perl, chỉnh sửa tại chỗ đã được cập nhật để trở nên linh hoạt hơn trong trường hợp hệ thống của bạn gặp sự cố nghiêm trọng như mất điện hoặc hết dung lượng đĩa. Đây là tác giả Perl brian d foy về cải tiến tại chỗ được cải thiện trong Perls gần đây.
Bạn nên cân nhắc sử dụng Perl cho các loại nhiệm vụ này, vì đây là ngôn ngữ lập trình đa năng cực kỳ mạnh mẽ nhưng được đánh giá thấp, một trong những mục tiêu thiết kế ban đầu của nó là thay thế sed
và awk
bằng thứ gì đó tốt hơn nhiều.
Khả năng phù hợp với regex Perl 5 và cải thiện cú pháp regex vượt xa những người sed
, awk
và trên thực tế tất cả các ngôn ngữ lập trình khác nhau từ Perl 6, làm cho Perl lựa chọn hợp lý nhất cho cả hai đơn giản và thao tác regex tiên tiến.
Để làm rõ: sed
cũng sẽ hoạt động tốt find
và bạn cũng có thể sử dụng sed -i.bkp
để tạo bản sao lưu của từng tệp được chỉnh sửa, nhưng theo tôi biết thì nó không có tính năng phục hồi bổ sung trong Perl 5.28 trở lên. Nó cũng sử dụng cú pháp regex UNIX ® truyền thống mạnh mẽ và kém mạnh mẽ hơn nhiều.
<\filename>
thay vì</filename>
trong một bối cảnh\f
sẽ được hiểu là nhân vật nguồn cấp dữ liệu. Bạn có thể nên theo dõi nguồn của các tệp này và chỉ ra vấn đề với công cụ tạo của chúng cho nhà phát triển. Để sửa các tập tin, câu trả lời được chấp nhận là tốt.