Ketika saya menjalankan perintah di Bash (atau lebih spesifik, wc -l < log.txt
), output berisi linebreak setelahnya. Bagaimana saya menyingkirkannya?
sumber
Ketika saya menjalankan perintah di Bash (atau lebih spesifik, wc -l < log.txt
), output berisi linebreak setelahnya. Bagaimana saya menyingkirkannya?
Jika output yang diharapkan adalah satu baris , Anda dapat menghapus semua karakter baris baru dari output. Tidak jarang pipa ke utilitas 'tr', atau Perl jika lebih disukai:
wc -l < log.txt | tr -d '\n'
wc -l < log.txt | perl -pe 'chomp'
Anda juga dapat menggunakan substitusi perintah untuk menghapus baris tambahan:
echo -n "$(wc -l < log.txt)"
printf "%s" "$(wc -l < log.txt)"
Harap dicatat bahwa saya tidak setuju dengan keputusan OP untuk memilih jawaban yang diterima. Saya percaya orang harus menghindari menggunakan 'xargs' jika memungkinkan. Ya, itu mainan yang keren. Tidak, Anda tidak membutuhkannya di sini.
Jika output yang diharapkan dapat berisi banyak baris , Anda harus membuat keputusan lain:
Jika Anda ingin menghapus beberapa karakter baris baru dari akhir file, gunakan kembali substitusi cmd:
printf "%s" "$(< log.txt)"
Jika Anda ingin benar-benar menghapus karakter baris baru THE LAST dari file, gunakan Perl:
perl -pe 'chomp if eof' log.txt
Perhatikan bahwa jika Anda yakin memiliki karakter baris baru yang ingin Anda hapus, Anda dapat menggunakan 'head' dari GNU coreutils untuk memilih semuanya kecuali byte terakhir. Ini harus cukup cepat:
head -c -1 log.txt
Selain itu, untuk kelengkapan, Anda dapat dengan cepat memeriksa di mana karakter baris baru Anda (atau karakter khusus lainnya) ada di file Anda menggunakan 'cat' dan flag 'show-all'. Karakter tanda dolar akan menunjukkan akhir dari setiap baris:
cat -A log.txt
tr --delete '\n'
.| tr -d '\r'
Satu arah:
sumber
echo -n `wc -l log.txt`
IFS
) ke satu spasi. Contoh:echo "a b" | xargs echo -n
;echo -n $(echo "a b")
. Ini mungkin atau mungkin tidak menjadi masalah untuk kasus penggunaan.-e
, itu akan ditafsirkan sebagai opsi untukecho
. Itu selalu lebih aman untuk digunakanprintf '%s'
.xargs
sangat lambat pada sistem saya (dan saya menduga itu pada sistem lain juga), jadiprintf '%s' $(wc -l log.txt)
mungkin lebih cepat, karenaprintf
biasanya builtin (Juga karena tidak ada pengalihan informasi). Jangan pernah menggunakan backticks, mereka telah usang dalam versi POSIX yang lebih baru dan memiliki banyak kelemahan.Ada juga dukungan langsung untuk menghilangkan white space di substitusi variabel Bash :
sumber
trailing_linebreak_removed=${testvar%?}
Jika Anda menetapkan outputnya ke variabel,
bash
secara otomatis menghapus spasi:sumber
printf sudah memotong baris tambahan untuk Anda:
Detail:
%s
tempat dudukan string.%s\n
), itu tidak akan.sumber
"$(command)"
, baris baru internal yang akan dipertahankan - dan hanya mengikuti baris akan dihapus. Shell sedang melakukan semua pekerjaan di sini -printf
hanyalah cara untuk mengarahkan kembali hasil substitusi perintahstdout
.$( )
konstruk. Ini buktinya:printf "%s" "$(perl -e 'print "\n"')"
$ printf '%s' "$(wc -l < log.txt)"
Jika Anda ingin menghapus hanya baris baru terakhir , pipa melalui:
sed
tidak akan menambahkan\0
ke akhir aliran jika pembatas diatur keNUL
via-z
, sedangkan untuk membuat file teks POSIX (didefinisikan berakhir di a\n
), selalu akan menghasilkan akhir\n
tanpa-z
.Misalnya:
Dan untuk membuktikan tidak ada yang
NUL
ditambahkan:Untuk menghapus beberapa baris baru , ikuti :
sumber
sed
tidak menyediakan-z
.Jika Anda ingin mencetak output apa pun di Bash tanpa akhir baris, Anda menggema dengan
-n
saklar.Jika Anda sudah memilikinya di variabel, gema dengan baris baru yang dipotong:
Atau Anda dapat melakukannya dalam satu baris, sebagai gantinya:
sumber
echo -n $(wc -l < log.txt)
memiliki efek yang sama.