Réponses:
En bash avec "Parameter Expansion" $ {paramètre: offset: length}
$ var=abcdef
$ echo ${var:0:1}
a
$ echo ${var:3:1}
d
Edit: sans expansion des paramètres (pas très élégant, mais c'est ce qui m'est venu en premier)
$ charpos() { pos=$1;shift; echo "$@"|sed 's/^.\{'$pos'\}\(.\).*$/\1/';}
$ charpos 8 what ever here
r
echo ${var: -2:1}
zsh
et mksh
.
Une 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
substr
n'est pas inclus dans l'expr de FreeBSD, NetBSD ou OS X. Ce n'est pas une solution portable.
substr
ne s'agit pas à l'origine d'une extension GNU. L'implémentation originale de expr
est venue de PWB Unix à la fin des années 70 et avait substr
(mais pas :
).
cut -c
Si la variable ne contient pas de sauts de ligne, 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 retours à la ligne:
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 avec les caractères d'échappement: /programming//a/40423558/895245 par exemple:
myvar='\n'
printf '%s\n' "$myvar" | cut -c1
sorties \
comme prévu.
Voir aussi: /programming/1405611/extracting-first-two-characters-of-a-string-shell-scripting
Testé dans Ubuntu 19.04.
printf '%s' "$myvar" | cut -c2
n'est pas POSIX car la sortie de printf
n'est pas du texte sauf si$myvar
se termine par un caractère de nouvelle ligne. Il suppose par ailleurs que la variable ne contient pas de caractères de nouvelle ligne car elle cut
coupe chaque ligne de son entrée.
awk
un serait plus efficace et fiable avecawk -- 'BEGIN {print substr (ARGV[1], 2, 1)}' "$myvar"
cut
, cela ne fonctionne pas pour les caractères multi-octets (idem pour mawk ou busybox awk)
printf 'abc '| cut -c2
c'est faux parce que non \n
(ce que je ne sais pas), ou que la commande échouera si myvar a des nouvelles lignes (ce que je suis d'accord)?
cut
n'est pas spécifié si l'entrée n'est pas du texte (bien que des cut
implémentations soient nécessaires pour gérer les lignes ou la longueur arbitraire). La sortie de printf abc
n'est pas du texte car elle ne se termine pas par un caractère de nouvelle ligne. En pratique, selon l'implémentation, si vous dirigez cela vers cut -c2
, vous obtenez soit b
, b<newline>
soit rien du tout. Vous auriez besoinprintf 'abc\n' | cut -c2
d'obtenir un comportement spécifié par POSIX (qui est requis pour sortir b<newline>
)
Avec zsh
ou yash
, vous utiliseriez:
$ text='€$*₭£'
$ printf '%s\n' "${text[3]}"
*
(dans zsh
, vous pouvez le raccourcir en printf '%s\n' $text[3]
).
Vous pouvez utiliser la commande cut. Pour obtenir la 3e position:
echo "SAMPLETEXT" | cut -c3
Vérifiez ce lien http://www.folkstalk.com/2012/02/cut-command-in-unix-linux-examples.html
( Cas avancés ) Cependant, la modification d'IFS est également une bonne chose, surtout lorsque votre entrée peut avoir des espaces. Dans ce cas uniquement, utilisez celui ci-dessous
saveifs=$IFS
IFS=$(echo -en "\n\b")
echo "SAMPLETEXT" | cut -c3
IFS=$saveifs
IFS
entrerait en jeu dans le code que vous avez publié.