Bagaimana cara mengganti semua tab di setiap file dalam cabang sistem file dengan masing-masing 2 spasi?

10

Saya kode Scala dan konvensi itu adalah untuk menggunakan spasi ganda per level untuk identifikasi. Tetapi menggunakan editor yang berbeda membuat sumber saya dipenuhi dengan campuran spasi dan tab.

Saya ingin memperbaiki semua file (* .scala file, sebenarnya, tetapi menentukan ini tidak perlu) (dalam direktori yang diberikan dan semua cabang FS yang mendasari (secara rekursif)) secara otomatis, mengganti semua tab dengan spasi ganda. Saya percaya ada cara mudah dan indah untuk melakukan ini dengan alat Unix / GNU klasik, tapi saya tidak punya pengalaman di bidang ini. Apakah Anda akan berbaik hati membantu saya?

Ivan
sumber

Jawaban:

9

Secara rekursif, menggunakan expand(yang dibuat untuk tujuan ini):find . -type f -name '*.scala' -exec bash -c 'for x in "$@"; do mv "$x"{,.bak} && expand -t 2 "$x.bak" > "$x" && rm "$x.bak"; done' {} +

Saya akan melakukannya dengan sedatau perl(lihat jawaban Sardathrion) karena mereka mendukung pengeditan sisip, tetapi saya tetap ingin menyebutkan hal yang baik expand.

EDIT: Itu akan menjadi find . -type f -name '*.scala' -exec perl -p -i -e $'s/\t/ /g' {} +

janmoesen
sumber
Varian pertama berfungsi seperti yang diharapkan. Varian kedua (perl) menggantikan tab dengan hanya satu spasi alih-alih dua.
Ivan
Ya, maaf: itu kesalahan pemformatan. Kode sumber mengatakan dua spasi, tetapi HTML yang diberikan hanya menunjukkan satu spasi.
janmoesen
10

Ini harus dilakukan:

find . -type f -name '*.scala$' -exec sed -i 's/\t/  /g' {} +

Catatan: ini belum diuji.

Sardathrion - menentang penyalahgunaan SE
sumber
1
Ini belum rekursif. Anda dapat menggunakan findatau shell yang mendukung **/*.scalarekursi.
janmoesen
Diedit untuk menambahkan perilaku rekursif ...
Sardathrion - terhadap penyalahgunaan SE
Tolong jangan mempromosikan find | xargs. Gunakan find -execsebagai gantinya, seperti yang saya sebutkan dalam jawaban saya. Lebih mudah dan aman.
janmoesen
Sudah mencoba ini, tidak ada hasil. Perintah segera kembali dan tidak ada perubahan di dalam file.
Ivan
ini tidak diuji tetapi intinya akan berfungsi.
Sardathrion - terhadap penyalahgunaan SE