Jawaban:
Coba yang berikut ini:
find ./ -type f -exec sed -i 's/\t/ /g' {} \;
Jika Anda ingin empat spasi, coba:
find ./ -type f -exec sed -i 's/\t/ /g' {} \;
's/\t/ /g'mengganti lebih dari satu tab per baris.
find ./ -type f -exec sed -i ’s/\t/ /g’ {} +" (yaitu, " +" bukannya " \;"), jika findversi mendukungnya (dan saya secara pribadi belum menemukan versi apa pun yang tidak, tetapi itu bukan standar POSIX , jadi saya kira itu bisa terjadi pada beberapa sistem. Lihat " -exec command {} +" di manual). Alih-alih meluncurkan satu contoh seduntuk setiap file, ini akan membangun daftar argumen dengan sebanyak argumen nama file yang didukung sistem ( getconf ARG_MAX= 2097152 pada sistem saya), sama seperti xargs, dan dengan demikian meluncurkan sedproses yang jauh lebih sedikit .
sedtidak memahami \turutan pelepasan tab. Anda bisa menggantinya dengan karakter tab literal, yang dapat Anda masukkan ke dalam shell dengan [Ctrl]+V, [Tab].
expandmungkin lebih baik daripada sedini, seperti yang dijelaskan dalam: stackoverflow.com/a/11094620/131824
Ada banyak cara untuk melakukan ini. Ada juga banyak cara untuk menembak diri sendiri saat melakukan ini jika Anda tidak hati-hati atau jika Anda baru mengenal Linux. Dengan asumsi bahwa Anda dapat membuat daftar file yang ingin Anda konversi, baik dengan menggunakan sesuatu seperti findatau secara manual dengan editor, cukup pipa daftar itu ke berikut ini.
while read file
do
expand "$file" > /tmp/expandtmp
mv /tmp/expandtmp "$file"
done
Salah satu cara Anda dapat menembak diri sendiri dengan melakukan itu adalah dengan membuat kesalahan ketik sehingga Anda akhirnya membuat file kosong ke semua nama file yang Anda tentukan, sehingga menghapus isi semua file Anda. Jadi berhati-hatilah dan ujilah apa pun yang Anda lakukan pertama kali pada sekumpulan kecil file yang telah Anda buat cadangannya.
mvbersyarat pada keberhasilan expand:expand ... && mv ...
expand -t 4untuk memperluas tab ke 4 spasi. Juga, metode ini dapat membuat trailing newlines. Tapi selain itu berhasil.
find . -type f -iname "*.js" -print0 | xargs -0 -I foo tab2space foo foo
-I foo membuat foo variabel templat untuk setiap baris input, sehingga Anda dapat merujuk ke input lebih dari sekali.
-print0dan -0beri tahu kedua perintah untuk menggunakan \ 0 sebagai pemisah baris alih-alih SPACE, jadi perintah ini berfungsi untuk jalur dengan spasi.
Ini lebih baik:
find . -name *.java ! -type d -exec bash -c 'expand -t 4 "$0" > /tmp/e && mv /tmp/e "$0"' {} \;
/tmp/ekarena jika ada yang menggunakan file itu, ini akan mengacaukannya. Seperti jika dua pengguna ingin menggunakan ini pada saat bersamaan.
Saya mencoba masalah ini dengan mempertimbangkan persyaratan berikut:
Persyaratan terakhir adalah yang paling sulit dipenuhi karena "memperluas" tidak memungkinkan untuk memodifikasi file di tempat.
Saya datang dengan solusi berikut:
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'
Berikut ini beberapa penjelasannya:
expand, saya berasumsi dia ingin pelurusan teks dipertahankan.