Saya memiliki skrip shell sederhana yang menghapus spasi kosong dari file. Apakah ada cara untuk membuat skrip ini lebih ringkas (tanpa membuat file sementara)?
sed 's/[ \t]*$//' $1 > $1__.tmp
cat $1__.tmp > $1
rm $1__.tmp
sed
whitespace
Viktor
sumber
sumber
mv
sebagai pengganticat
danrm
. Kenapa kamu tetap menggunakancat
seperti itu? Mengapa tidak digunakancp
?cat
untuk menimpa file asli daripadamv
benar-benar akan menggantikan data dalam file asli (yaitu, itu tidak akan merusak tautan keras). Menggunakansed -i
seperti yang diusulkan dalam banyak solusi tidak akan berhasil. IOW, terus lakukan apa yang Anda lakukan.Jawaban:
Anda dapat menggunakan dalam pilihan tempat
-i
darised
untuk Linux dan Unix:Sadarilah ekspresi akan menghapus jejak
t
di OSX (Anda dapat menggunakangsed
untuk menghindari masalah ini). Mungkin juga menghapusnya di BSD.Jika Anda tidak memiliki gsed, berikut adalah sintaks sed yang benar (tetapi sulit dibaca) di OSX:
Tiga string yang dikutip tunggal akhirnya digabungkan menjadi satu argumen / ekspresi. Tidak ada operator penggabungan dalam bash, Anda cukup menempatkan string satu demi satu tanpa spasi di antaranya.
The
$'\t'
resolve sebagai tab-karakter literal di bash (menggunakan ANSI-C mengutip ), sehingga tab dengan benar rubah menjadi ekspresi.sumber
sed: Not a recognized flag: i
t
:)\t
adalah tab, bagi mereka yang mungkin belum tahu.Setidaknya di Mountain Lion, jawaban Viktor juga akan menghilangkan karakter 't' saat berada di akhir baris. Perbaikan berikut ini mengatasi masalah tersebut:
sumber
-E
menunjukkan "ekspresi reguler (modern) yang diperluas"sed
di El Capitan tidak.Terima kasih kepada codaddict karena telah menyarankan
-i
opsi.Perintah berikut memecahkan masalah di Snow Leopard
sumber
\t
sed selain GNU sed dan itu akan ditafsirkan sebagai huruf literalt
. Perintah hanya tampak berfungsi, mungkin karena tidak ada TAB di spasi kosong ataut
di akhir kalimat di file Anda.''
Tidak disarankan menggunakan tanpa menentukan sufiks cadangan.Yang terbaik adalah mengutip $ 1:
sumber
sumber
Saya memiliki skrip di .bashrc saya yang bekerja di bawah OSX dan Linux (hanya bash!)
yang saya tambahkan:
sumber
Bagi mereka yang mencari efisiensi (banyak file untuk diproses, atau file besar), menggunakan
+
operator pengulangan alih-alih*
membuat perintah lebih dari dua kali lebih cepat.Dengan GNU sed:
Saya juga dengan cepat membandingkan sesuatu yang lain: menggunakan
[ \t]
alih-alih[[:space:]]
juga secara signifikan mempercepat proses (GNU sed v4.4):sumber
Hanya untuk bersenang-senang:
sumber
Dalam kasus khusus
sed
,-i
opsi yang telah disebutkan orang lain adalah yang paling sederhana dan paling waras.Dalam kasus yang lebih umum
sponge
, darimoreutils
collection, melakukan apa yang Anda inginkan: ini memungkinkan Anda mengganti file dengan hasil pemrosesannya, dengan cara yang dirancang khusus untuk menjaga langkah pemrosesan agar tidak tersandung sendiri dengan menimpa file itu sendiri. bekerja pada. Mengutipsponge
halaman manual:https://joeyh.name/code/moreutils/
sumber
Untuk hanya menghapus spasi putih (dalam kasus saya spasi dan tab) dari baris dengan setidaknya satu karakter non-spasi (dengan cara ini baris kosong tidak disentuh):
sumber