Bagaimana cara mendapatkan char pada posisi tertentu dari string di skrip shell?
shell
shell-script
Tom Brito
sumber
sumber
echo ${var: -2:1}
zsh
danmksh
.Alternatif untuk ekspansi parameter adalah
expr substr
Sebagai contoh:
sumber
substr
tidak termasuk dalam expr dari FreeBSD, NetBSD atau OS X. Ini bukan solusi portabel.substr
awalnya bukan merupakan ekstensi GNU. Implementasi asliexpr
berasal dari PWB Unix di akhir 70-an dan telahsubstr
(tetapi tidak:
).cut -c
Jika variabel tidak mengandung baris baru yang dapat Anda lakukan:
output:
awk substr
adalah alternatif POSIX lain yang berfungsi bahkan jika variabel memiliki baris baru:output:
printf '%s\n'
adalah untuk menghindari masalah dengan karakter pelarian: /programming//a/40423558/895245 misalnya:output
\
seperti yang diharapkan.Lihat juga: /programming/1405611/extracting-first-two-characters-of-a-string-shell-scripting
Diuji di Ubuntu 19,04.
sumber
printf '%s' "$myvar" | cut -c2
bukan POSIX karena outputprintf
bukan teks kecuali$myvar
diakhiri dengan karakter baris baru. Jika tidak, asumsi variabel tidak mengandung karakter baris baru karenacut
memotong setiap baris inputnya.awk
satu akan lebih efisien dan dapat diandalkan denganawk -- 'BEGIN {print substr (ARGV[1], 2, 1)}' "$myvar"
cut
, itu tidak berfungsi untuk karakter multi-byte (sama untuk mawk atau busybox awk)printf 'abc '| cut -c2
salah karena tidak\n
(ini saya tidak tahu), atau bahwa perintah akan gagal jika myvar memiliki baris baru (ini saya setuju)?cut
tidak ditentukan jika input bukan teks (meskipuncut
implementasi diperlukan untuk menangani garis atau panjang sewenang-wenang). Output dariprintf abc
bukan teks karena tidak diakhiri dengan karakter baris baru. Dalam praktik tergantung pada implementasinya, jika Anda menyalurkannyacut -c2
, Anda mendapatkan keduanyab
,b<newline>
atau tidak sama sekali. Anda harusprintf 'abc\n' | cut -c2
mendapatkan perilaku yang ditentukan oleh POSIX (yang diperlukan untuk menampilkanb<newline>
)Dengan
zsh
atauyash
, Anda akan menggunakan:(dalam
zsh
, Anda dapat mempersingkatprintf '%s\n' $text[3]
).sumber
Anda dapat menggunakan perintah cut. Untuk mendapatkan posisi ke-3:
Periksa tautan ini http://www.folkstalk.com/2012/02/cut-command-in-unix-linux-examples.html
( Kasus lanjutan ) Namun, memodifikasi IFS juga merupakan hal yang baik, terutama ketika input Anda memiliki spasi. Dalam hal itu saja, gunakan yang di bawah ini
sumber
IFS
ikut bermain dalam kode yang telah Anda posting.