Yanıtlar:
"Parameter Expansion" ile bash'da $ {parametre: offset: length}
$ var=abcdef
$ echo ${var:0:1}
a
$ echo ${var:3:1}
d
Düzenleme: Parametre genişletme olmadan (çok zarif değil, ama önce bana geldi)
$ charpos() { pos=$1;shift; echo "$@"|sed 's/^.\{'$pos'\}\(.\).*$/\1/';}
$ charpos 8 what ever here
r
echo ${var: -2:1}
zsh
ve tarafından desteklenir mksh
.
Parametre genişletmeye alternatif expr substr
substr STRING POS LENGTH
substring of STRING, POS counted from 1
Örneğin:
$ expr substr hello 2 1
e
substr
, FreeBSD, NetBSD veya OS X expr dahil değildir. Bu taşınabilir bir çözüm değil.
substr
bunun aslında bir GNU uzantısı olmadığını unutmayın . Orijinal uygulaması expr
70'lerin sonunda PWB Unix'ten geldi ve vardı substr
(ama değil :
).
cut -c
Değişken yeni satır içermiyorsa şunları yapabilirsiniz:
myvar='abc'
printf '%s\n' "$myvar" | cut -c2
çıktılar:
b
awk substr
değişkenin yeni satırları olsa bile çalışan başka bir POSIX alternatifidir:
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"
çıktılar:
b
printf '%s\n'
kaçış karakterleriyle ilgili sorunlardan kaçınmaktır: /programming//a/40423558/895245 eg:
myvar='\n'
printf '%s\n' "$myvar" | cut -c1
çıktılar \
beklendiği gibi.
Ayrıca bakınız: /programming/1405611/extracting-first-two-characters-of-a-string-shell-scripting
Ubuntu 19.04'te test edildi.
printf '%s' "$myvar" | cut -c2
yeni satır karakteri ile bitmediği printf
sürece metin olmadığı için POSIX değildir $myvar
. Aksi takdirde , girdinin her satırınıcut
keserken değişkenin yeni satır karakteri içermediğini varsayar .
awk
daha verimli ve güvenilir olurduawk -- 'BEGIN {print substr (ARGV[1], 2, 1)}' "$myvar"
cut
, bunun çok baytlı karakterler için çalışmadığını unutmayın (mawk veya busybox awk için aynıdır)
printf 'abc '| cut -c2
bunun yanlış olduğu anlamına mı geliyor, çünkü hayır \n
(bunu bilmiyorum) ya da myvar'ın yeni satırları varsa komutun başarısız olacağını mı düşünüyorsun?
cut
Girdi metin değilse davranışı belirtilmez (ancak cut
satırları veya rasgele uzunluğu işlemek için uygulamalar gereklidir). Çıktısı printf abc
değil metin bir satır karakteriyle bitmiyor olarak. Uygulamada uygulamaya bağlı olarak cut -c2
, bunu yönlendirirseniz b
, b<newline>
ya hiç alırsınız ya da hiçbir şey almazsınız . printf 'abc\n' | cut -c2
POSIX tarafından belirtilen bir davranışı almanız gerekir (çıktı için gereklidir b<newline>
)
İle zsh
ya yash
, kullanmak istiyorum:
$ text='€$*₭£'
$ printf '%s\n' "${text[3]}"
*
(içinde zsh
kısaltabilirsiniz printf '%s\n' $text[3]
).
Cut komutunu kullanabilirsiniz. 3. pozisyonu almak için:
echo "SAMPLETEXT" | cut -c3
Bu bağlantıyı kontrol edin http://www.folkstalk.com/2012/02/cut-command-in-unix-linux-examples.html
( Gelişmiş durumlar ) IFS'de değişiklik yapmak, özellikle girdileriniz boşluklar olduğunda da iyi bir şeydir. Sadece bu durumda, aşağıdakini kullanın
saveifs=$IFS
IFS=$(echo -en "\n\b")
echo "SAMPLETEXT" | cut -c3
IFS=$saveifs
IFS
Gönderdiğiniz kodda nasıl oyuna gireceğini göremiyorum .