Saya memiliki banyak file dengan tab yang berserakan, dan saya ingin mengonversinya menjadi spasi. Saya tahu tentang expand
perintah itu, tetapi sayangnya saya harus mengetikkan setiap file yang menggunakannya. Apakah ada cara yang lebih mudah untuk melakukan ini di Linux?
linux
text-editing
orang
sumber
sumber
expand
, saya berasumsi dia ingin pelurusan teks dipertahankan.'s/\t/ /g'
mengganti lebih dari satu tab per baris.find ./ -type f -exec sed -i ’s/\t/ /g’ {} +
" (yaitu, "+
" bukannya "\;
"), jikafind
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 contohsed
untuk setiap file, ini akan membangun daftar argumen dengan sebanyak argumen nama file yang didukung sistem (getconf ARG_MAX
= 2097152 pada sistem saya), sama sepertixargs
, dan dengan demikian meluncurkansed
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 daripadased
ini, seperti yang dijelaskan dalam: stackoverflow.com/a/11094620/131824Ada 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.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.
sumber
mv
bersyarat pada keberhasilanexpand
:expand ... && mv ...
expand -t 4
untuk memperluas tab ke 4 spasi. Juga, metode ini dapat membuat trailing newlines. Tapi selain itu berhasil.-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.sumber
Cons:
file yang lebih besar dari ukuran buffer pipa ( 64KB ) terpotong
Kelebihan:
tidak ada file temp file yang
lebih besar dari ukuran buffer pipa yang terpotong
sumber
Ini lebih baik:
sumber
/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:
Berikut ini beberapa penjelasannya:
sumber