Ketika saya menjalankan perintah di Bash (atau lebih spesifik, wc -l < log.txt
), output berisi linebreak setelahnya. Bagaimana saya menyingkirkannya?
Ketika saya menjalankan perintah di Bash (atau lebih spesifik, wc -l < log.txt
), output berisi linebreak setelahnya. Bagaimana saya menyingkirkannya?
Jawaban:
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:
wc -l < log.txt | xargs echo -n
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 untuk echo
. Itu selalu lebih aman untuk digunakan printf '%s'
.
xargs
sangat lambat pada sistem saya (dan saya menduga itu pada sistem lain juga), jadi printf '%s' $(wc -l log.txt)
mungkin lebih cepat, karena printf
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 :
testvar=$(wc -l < log.txt)
trailing_space_removed=${testvar%%[[:space:]]}
leading_space_removed=${testvar##[[:space:]]}
trailing_linebreak_removed=${testvar%?}
Jika Anda menetapkan outputnya ke variabel, bash
secara otomatis menghapus spasi:
linecount=`wc -l < log.txt`
printf sudah memotong baris tambahan untuk Anda:
$ printf '%s' $(wc -l < log.txt)
Detail:
%s
tempat dudukan string. %s\n
), itu tidak akan."$(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 perintah stdout
.
$( )
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 -z '$ s/\n$//'
sed
tidak akan menambahkan \0
ke akhir aliran jika pembatas diatur ke NUL
via -z
, sedangkan untuk membuat file teks POSIX (didefinisikan berakhir di a \n
), selalu akan menghasilkan akhir \n
tanpa -z
.
Misalnya:
$ { echo foo; echo bar; } | sed -z '$ s/\n$//'; echo tender
foo
bartender
Dan untuk membuktikan tidak ada yang NUL
ditambahkan:
$ { echo foo; echo bar; } | sed -z '$ s/\n$//' | xxd
00000000: 666f 6f0a 6261 72 foo.bar
Untuk menghapus beberapa baris baru , ikuti :
sed -Ez '$ s/\n+$//'
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:
$ testvar=$(wc -l < log.txt)
$ echo -n $testvar
Atau Anda dapat melakukannya dalam satu baris, sebagai gantinya:
$ echo -n $(wc -l < log.txt)
echo -n $(wc -l < log.txt)
memiliki efek yang sama.