Câu trả lời:
Hãy thử như sau:
find ./ -type f -exec sed -i 's/\t/ /g' {} \;
Nếu bạn muốn bốn không gian, hãy thử:
find ./ -type f -exec sed -i 's/\t/ /g' {} \;
's/\t/ /g'
thay thế nhiều hơn một tab trên mỗi dòng.
find ./ -type f -exec sed -i ’s/\t/ /g’ {} +
" (nghĩa là " +
" thay vì " \;
"), nếu find
phiên bản hỗ trợ (và cá nhân tôi chưa gặp bất kỳ phiên bản nào không có, nhưng đó không phải là tiêu chuẩn POSIX , vì vậy tôi đoán nó có thể xảy ra trên một số hệ thống. Xem " -exec command {} +
" trong hướng dẫn). Thay vì khởi chạy một phiên bản sed
cho mỗi tệp, điều này sẽ xây dựng một danh sách đối số có nhiều đối số tên tệp mà hệ thống hỗ trợ ( getconf ARG_MAX
= 2097152 trên hệ thống của tôi), giống như xargs
, và do đó khởi chạy ít sed
quy trình hơn .
sed
không hiểu \t
trình tự thoát tab. Bạn có thể thay thế nó bằng một ký tự tab theo nghĩa đen mà bạn có thể nhập vào trình bao [Ctrl]+V, [Tab]
.
Có rất nhiều cách để làm điều này. Cũng có rất nhiều cách để bạn tự bắn vào chân mình trong khi thực hiện việc này nếu bạn không cẩn thận hoặc nếu bạn chưa quen với Linux như bạn có vẻ. Giả sử rằng bạn có thể tạo một danh sách các tệp mà bạn muốn chuyển đổi, bằng cách sử dụng một cái gì đó giống find
hoặc bằng tay với một trình soạn thảo, chỉ cần đưa danh sách đó vào danh sách sau đây.
while read file
do
expand "$file" > /tmp/expandtmp
mv /tmp/expandtmp "$file"
done
Một cách bạn có thể tự bắn vào chân mình là tạo một lỗi đánh máy để bạn kết thúc một tập tin trống cho tất cả các tên tập tin bạn chỉ định, từ đó xóa nội dung của tất cả các tập tin của bạn. Vì vậy, hãy cẩn thận và kiểm tra bất cứ điều gì bạn làm đầu tiên trên một tập hợp nhỏ các tập tin mà bạn đã sao lưu.
mv
điều kiện về sự thành công của expand
:expand ... && mv ...
expand -t 4
mở rộng các tab thành 4 không gian. Ngoài ra, phương pháp này có thể tạo ra các dòng mới. Nhưng nếu không nó hoạt động.
find . -type f -iname "*.js" -print0 | xargs -0 -I foo tab2space foo foo
-I foo
tạo một biến mẫu foo cho mỗi dòng đầu vào, do đó bạn có thể tham khảo đầu vào nhiều lần.
-print0
và -0
báo cho cả hai lệnh sử dụng \ 0 làm dấu tách dòng thay vì SPACE, vì vậy lệnh này hoạt động cho các đường dẫn có khoảng trắng.
Thế này tốt hơn:
find . -name *.java ! -type d -exec bash -c 'expand -t 4 "$0" > /tmp/e && mv /tmp/e "$0"' {} \;
/tmp/e
bởi vì nếu có bất cứ điều gì khác đang sử dụng tập tin đó, điều này sẽ làm rối tung nó. Giống như nếu hai người dùng muốn sử dụng điều này cùng một lúc.
Tôi đã đưa ra vấn đề này với một yêu cầu sau đây:
Yêu cầu cuối cùng là khó thực hiện nhất vì "mở rộng" không cho phép sửa đổi các tệp tại chỗ.
Tôi đã đưa ra giải pháp sau đây:
find . -type f -regextype egrep -regex '.*\.(c|cpp|h|hpp)' -print0 | xargs -0 -n 1 -P 10 -IFILE bash -c ' ( echo "Processing FILE..." && expand -t 4 "FILE" > /tmp/expand.$$ && mv /tmp/expand.$$ "FILE" ) || exit 255'
Đây là một số giải thích:
expand
, tôi cho rằng họ muốn sự liên kết của văn bản được bảo tồn.