Jawaban:
Di bash dengan "Ekspansi Parameter" $ {parameter: offset: length}
$ var=abcdef
$ echo ${var:0:1}
a
$ echo ${var:3:1}
d
Sunting: Tanpa ekspansi parameter (tidak terlalu elegan, tapi itu yang pertama kali saya ingat)
$ charpos() { pos=$1;shift; echo "$@"|sed 's/^.\{'$pos'\}\(.\).*$/\1/';}
$ charpos 8 what ever here
r
echo ${var: -2:1}
zshdan mksh.
Alternatif untuk ekspansi parameter adalah expr substr
substr STRING POS LENGTH
substring of STRING, POS counted from 1
Sebagai contoh:
$ expr substr hello 2 1
e
substrtidak termasuk dalam expr dari FreeBSD, NetBSD atau OS X. Ini bukan solusi portabel.
substrawalnya bukan merupakan ekstensi GNU. Implementasi asli exprberasal dari PWB Unix di akhir 70-an dan telah substr(tetapi tidak :).
cut -c
Jika variabel tidak mengandung baris baru yang dapat Anda lakukan:
myvar='abc'
printf '%s\n' "$myvar" | cut -c2
output:
b
awk substr adalah alternatif POSIX lain yang berfungsi bahkan jika variabel memiliki baris baru:
myvar="$(printf 'a\nb\n')" # note that the last newline is stripped by
# the command substitution
awk -- 'BEGIN {print substr (ARGV[1], 3, 1)}' "$myvar"
output:
b
printf '%s\n'adalah untuk menghindari masalah dengan karakter pelarian: /programming//a/40423558/895245 misalnya:
myvar='\n'
printf '%s\n' "$myvar" | cut -c1
output \ seperti yang diharapkan.
Lihat juga: /programming/1405611/extracting-first-two-characters-of-a-string-shell-scripting
Diuji di Ubuntu 19,04.
printf '%s' "$myvar" | cut -c2bukan POSIX karena output printfbukan teks kecuali $myvardiakhiri dengan karakter baris baru. Jika tidak, asumsi variabel tidak mengandung karakter baris baru karena cutmemotong setiap baris inputnya.
awksatu 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 -c2salah karena tidak \n(ini saya tidak tahu), atau bahwa perintah akan gagal jika myvar memiliki baris baru (ini saya setuju)?
cuttidak ditentukan jika input bukan teks (meskipun cutimplementasi diperlukan untuk menangani garis atau panjang sewenang-wenang). Output dari printf abcbukan teks karena tidak diakhiri dengan karakter baris baru. Dalam praktik tergantung pada implementasinya, jika Anda menyalurkannya cut -c2, Anda mendapatkan keduanya b, b<newline>atau tidak sama sekali. Anda harus printf 'abc\n' | cut -c2mendapatkan perilaku yang ditentukan oleh POSIX (yang diperlukan untuk menampilkan b<newline>)
Dengan zshatau yash, Anda akan menggunakan:
$ text='€$*₭£'
$ printf '%s\n' "${text[3]}"
*
(dalam zsh, Anda dapat mempersingkat printf '%s\n' $text[3]).
Anda dapat menggunakan perintah cut. Untuk mendapatkan posisi ke-3:
echo "SAMPLETEXT" | cut -c3
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
saveifs=$IFS
IFS=$(echo -en "\n\b")
echo "SAMPLETEXT" | cut -c3
IFS=$saveifs
IFSikut bermain dalam kode yang telah Anda posting.