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}
zshve 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.
substrbunun aslında bir GNU uzantısı olmadığını unutmayın . Orijinal uygulaması expr70'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 -c2yeni satır karakteri ile bitmediği printfsü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 .
awkdaha 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 -c2bunun 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?
cutGirdi metin değilse davranışı belirtilmez (ancak cutsatırları veya rasgele uzunluğu işlemek için uygulamalar gereklidir). Çıktısı printf abcdeğ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 -c2POSIX tarafından belirtilen bir davranışı almanız gerekir (çıktı için gereklidir b<newline>)
İle zshya yash, kullanmak istiyorum:
$ text='€$*₭£'
$ printf '%s\n' "${text[3]}"
*
(içinde zshkı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
IFSGönderdiğiniz kodda nasıl oyuna gireceğini göremiyorum .