Comment obtenir le char à une position donnée d'une chaîne dans le script shell?
En bash avec "Dispansion de paramètres" $ {Paramètre: Décalage: longueur}
$ var=abcdef
$ echo ${var:0:1}
a
$ echo ${var:3:1}
d
EDIT: sans expansion de paramètre (pas très élégant, mais c'est ce qui me vint d'abord)
$ charpos() { pos=$1;shift; echo "$@"|sed 's/^.\{'$pos'\}\(.\).*$/\1/';}
$ charpos 8 what ever here
r
Alternative à l'expansion des paramètres est expr substr
substr STRING POS LENGTH
substring of STRING, POS counted from 1
Par exemple:
$ expr substr hello 2 1
e
cut -c
Si la variable ne contient pas de nouvelles lignes, vous pouvez faire:
myvar='abc'
printf '%s\n' "$myvar" | cut -c2
les sorties:
b
awk substr
est une autre alternative POSIX qui fonctionne même si la variable a des lignes neuves:
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"
les sorties:
b
printf '%s\n'
est d'éviter les problèmes de caractères d'évacuation: https://stackoverflow.com/a/40423558/895245 E.g.:
myvar='\n'
printf '%s\n' "$myvar" | cut -c1
les sorties \
comme prévu.
Voir aussi: https://stackoverflow.com/questions/1405611/extractting-first-two-charsters-of-a-string-shell-scripting
Testé à Ubuntu 19.04.
Avec zsh
ou yash
, vous utiliseriez:
$ text='€$*₭£'
$ printf '%s\n' "${text[3]}"
*
(dans zsh
, vous pouvez la raccourcir à printf '%s\n' $text[3]
).
Vous pouvez utiliser la commande CUT. Pour obtenir la 3ème postion:
echo "SAMPLETEXT" | cut -c3
Vérifiez ce lien http://www.flfolkstalk.com/2012/02/cut-command-in-unix-linux-examples.html
( Cas avancés ) Cependant, modifier les IFS est également une bonne chose, en particulier lorsque votre entrée pourrait avoir des espaces. Dans ce cas seul, utilisez celui ci-dessous
saveifs=$IFS
IFS=$(echo -en "\n\b")
echo "SAMPLETEXT" | cut -c3
IFS=$saveifs