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}
zsh
dan 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
substr
tidak termasuk dalam expr dari FreeBSD, NetBSD atau OS X. Ini bukan solusi portabel.
substr
awalnya bukan merupakan ekstensi GNU. Implementasi asli expr
berasal 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 -c2
bukan POSIX karena output printf
bukan teks kecuali $myvar
diakhiri dengan karakter baris baru. Jika tidak, asumsi variabel tidak mengandung karakter baris baru karena cut
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 (meskipun cut
implementasi diperlukan untuk menangani garis atau panjang sewenang-wenang). Output dari printf abc
bukan 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 -c2
mendapatkan perilaku yang ditentukan oleh POSIX (yang diperlukan untuk menampilkan b<newline>
)
Dengan zsh
atau 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
IFS
ikut bermain dalam kode yang telah Anda posting.