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 find
versi 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 sed
untuk 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 sed
proses yang jauh lebih sedikit .
sed
tidak memahami \t
urutan pelepasan tab. Anda bisa menggantinya dengan karakter tab literal, yang dapat Anda masukkan ke dalam shell dengan [Ctrl]+V, [Tab]
.
expand
mungkin lebih baik daripada sed
ini, 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 find
atau 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.
mv
bersyarat pada keberhasilan expand
:expand ... && mv ...
expand -t 4
untuk 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.
-print0
dan -0
beri 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/e
karena 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.