Di berbagai tempat di web saya temukan:
\015
\012
\x0a - hex
\n
\r
semua sebagai sinonim untuk berbagai baris baru / pengembalian carriage ...
Tetapi dalam skrip kecil ini saya tidak bisa mengenali ketika saya menemukan baris baru - dapatkah seseorang memberi tahu saya apa yang harus saya periksa di baris if?
#!/bin/bash
test="this is a
test"
for a in "$test"; do
if [[ "$a" == '\012' ]] ; then
echo "FOUND NEWLINE"
fi
echo "$a"
done
cat | while read line; do ...; done
, Anda tahu ada carriage return untuk setiap iterasi. Jika input Anda dapat berupa file\r
tanpa\n
, cukup ubah filetr '\r' '\n'
saat memproses input. Jika Anda hanya perlu tahu jika ada beberapa baris:wc -l
.wc -l
akan kembali 0; Anda harus menambahkan itu sebagai jawabanJawaban:
Jika Anda secara langsung menggunakan string di bawah satu
for
lingkaran, itu akan berfungsi per-kata (di sini pada satu kata: seluruh konten$test
sejak dikutip), bukan per-karakter. Anda perlu menggunakanwhile
loop denganread
untuk mengurai huruf-demi-huruf, atau untuk memperkenalkan parameter numerik yang akan diulang di atas string.Selain itu, saat menggunakan
read
, Anda perlu memastikan bahwa baris baru dan ruang putih tidak diartikan sebagai pembatas dan memaksaread
untuk membaca satu karakter sekaligus.Ini versi yang berfungsi:
Anda dapat mengganti
$'\n'
dengan$'\012'
atau$'\x0a'
, karena semuanya mewakili kode baris baru yang sama. Tetapi tidak sama dengan\015
atau\r
- ini singkatan dari carriage return (kembali ke awal baris). Pada sistem Linux, baris baru diwakili menggunakan\n
, tetapi pada Windows misalnya, mereka diwakili oleh urutan\r\n
sebagai gantinya. Itu sebabnya jika Anda memiliki file teks dari Windows, Anda dapat mendeteksi baris baru juga dengan mencari\r
.sumber
\n
menjadi representasi byte, sehingga Anda tidak perlu menempatkan jeda baris yang tampak jelek dan dikutip dalam pernyataan pengujian Anda.Anda dapat memeriksa baris baru dalam variabel dengan sangat mudah di bash dengan:
Saya merasa lebih nyaman untuk digunakan:
sumber
Saya sarankan menggunakan
tr
dan kemudiantest
:The
tr -cd
menghapus segala sesuatu kecuali baris / enter. Jika ada baris baru dalam file, maka akan ada output dari mana-n
tes akan mengembalikan true.sumber
\r
s karena penggantian perintah menghapus karakter baris baru yang tertinggal ("$(printf '\n\n\n\n\n')"
adalah string kosong).