Yanıtlar:
Takip etmeyi dene:
find ./ -type f -exec sed -i 's/\t/ /g' {} \;
Dört boşluk istiyorsanız şunu deneyin:
find ./ -type f -exec sed -i 's/\t/ /g' {} \;
's/\t/ /g'
satırda bir sekme daha yerine.
find ./ -type f -exec sed -i ’s/\t/ /g’ {} +
" (yani " +
" yerine " \;
") yapıyorsa, find
sürüm destekliyorsa (ve kişisel olarak olmayan herhangi bir sürümle karşılaşmadım, ancak POSIX standardı değil) , sanırım bazı sistemlerde olabilir. -exec command {} +
Kılavuzdaki " " bölümüne bakın ). sed
Her dosya için bir örneğini başlatmak yerine , bu, sistemin desteklediği kadar çok sayıda dosya adı bağımsız değişkeniyle (sistemimde getconf ARG_MAX
= 2097152) bir argüman listesi oluşturacak xargs
ve böylece daha az sed
işlem başlatacaktır .
sed
anlamıyor \t
. Kabuğa girebileceğiniz bir değişmez sekme karakteri ile değiştirebilirsiniz [Ctrl]+V, [Tab]
.
Bunu yapmanın birçok yolu var. Dikkatli olmazsanız veya göründüğünüz gibi Linux'ta yeniyseniz bunu yaparken kendinizi vurmanın birçok yolu vardır. find
Bir editör gibi veya elle bir düzenleyici kullanarak dönüştürmek istediğiniz dosyaların bir listesini oluşturabileceğinizi varsayarsak, bu listeyi aşağıdakilere ekleyin.
while read file
do
expand "$file" > /tmp/expandtmp
mv /tmp/expandtmp "$file"
done
Kendinizi ayağınızdan çekmenin bir yolu, bir yazım hatası yapmaktır, böylece boş bir dosyayı belirttiğiniz tüm dosya adlarına sarar, böylece tüm dosyalarınızın içeriğini silersiniz. Bu yüzden dikkatli olun ve yedeklediğiniz küçük bir dosya kümesinde ilk yaptığınız şeyi test edin.
mv
expand
expand ... && mv ...
expand -t 4
Sekmeleri 4 aralığa genişletmeyi unutmayın . Ayrıca, bu yöntem sondaki satırsonu oluşturabilir. Ama aksi halde çalışır.
find . -type f -iname "*.js" -print0 | xargs -0 -I foo tab2space foo foo
-I foo
her giriş satırı için bir şablon değişkeni foo oluşturur, böylece girişe birden çok kez başvurabilirsiniz.
-print0
ve -0
her iki komuta da SPACE yerine bir satır ayırıcı olarak \ 0 kullanmasını söyleyin, böylece bu komut boşluklu yollar için çalışır.
Bu daha iyi:
find . -name *.java ! -type d -exec bash -c 'expand -t 4 "$0" > /tmp/e && mv /tmp/e "$0"' {} \;
/tmp/e
çünkü o dosyayı başka bir şey kullanıyorsa, bu dosyayı bozacaktır. İki kullanıcı bunu aynı anda kullanmak istiyorsa olduğu gibi.
Bu sorunu aşağıdaki gereksinimleri göz önünde bulundurarak denedim:
"Genişletme", dosyaların yerinde değiştirilmesine izin vermediğinden, son gereksinim yerine getirilmesi en zor olanıydı.
Aşağıdaki çözümü buldum:
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'
İşte bazı açıklamalar:
expand
, korunan metnin hizalanmasını istediğini varsayıyorum.