Điều này chủ yếu là ngoài chủ đề, nhưng bạn có thể sử dụng
find -maxdepth 1 -type f -name '*.txt' | xargs python -c '
import fileinput
for line in fileinput.input(inplace=True):
print line.replace("blah", "blee"),
'
Lợi ích chính ở đây (hơn ... xargs ... -I {} ... sed ...
) là tốc độ: bạn tránh gọi sed
10 triệu lần. Sẽ nhanh hơn nếu bạn có thể tránh sử dụng Python (vì python là loại chậm, tương đối), vì vậy perl có thể là lựa chọn tốt hơn cho nhiệm vụ này. Tôi không chắc làm thế nào để làm tương đương thuận tiện với perl.
Cách thức hoạt động này là xargs
sẽ gọi Python với nhiều đối số nhất có thể phù hợp với một dòng lệnh duy nhất và tiếp tục làm điều đó cho đến khi hết đối số (được cung cấp bởi ls -f *.txt
). Số lượng đối số cho mỗi lần gọi sẽ phụ thuộc vào độ dài của tên tệp và, ừm, một số nội dung khác. Các fileinput.input
chức năng mang lại dòng liên tiếp từ các tập tin có tên trong lập luận của mỗi invocation, và các inplace
tùy chọn cho nó để kỳ diệu "bắt" đầu ra và sử dụng nó để thay thế mỗi dòng.
Lưu ý rằng replace
phương thức chuỗi của Python không sử dụng regexps; nếu bạn cần những thứ đó, bạn phải import re
và sử dụng print re.sub(line, "blah", "blee")
. Chúng là các RegExps tương thích Perl, là loại phiên bản được củng cố mạnh mẽ của những phiên bản bạn có sed -r
.
biên tập
Như akira đã đề cập trong các bình luận, phiên bản gốc sử dụng lệnh global ( ls -f *.txt
) thay cho find
lệnh sẽ không hoạt động vì các khối được xử lý bởi chính shell ( bash
). Điều này có nghĩa là trước khi lệnh thậm chí được chạy, 10 triệu tên tệp sẽ được thay thế vào dòng lệnh. Điều này được đảm bảo khá nhiều để vượt quá kích thước tối đa của danh sách đối số của lệnh. Bạn có thể sử dụng xargs --show-limits
cho thông tin cụ thể hệ thống về điều này.
Kích thước tối đa của danh sách đối số cũng được tính đến xargs
, điều này giới hạn số lượng đối số mà nó truyền cho mỗi lần gọi của python theo giới hạn đó. Vì xargs
vẫn sẽ phải gọi python khá nhiều lần, nên sử dụng đề xuất của akira os.path.walk
để lấy danh sách tập tin có thể sẽ giúp bạn tiết kiệm thời gian.
sed
cho mỗi tệp. Tôi không chắc có cách nào để mở, chỉnh sửa, lưu và đóng một loạt các tệp trong đó khôngsed
; nếu tốc độ là điều cần thiết, bạn có thể muốn sử dụng một chương trình khác, có thể là perl hoặc python.