Comment obtenir le caractère à une position donnée d'une chaîne dans un script shell?
shell
shell-script
Tom Brito
la source
la source
echo ${var: -2:1}
zsh
etmksh
.Une alternative à l'expansion des paramètres est
expr substr
Par exemple:
la source
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 deexpr
est venue de PWB Unix à la fin des années 70 et avaitsubstr
(mais pas:
).cut -c
Si la variable ne contient pas de sauts de ligne, vous pouvez faire:
les sorties:
awk substr
est une autre alternative POSIX qui fonctionne même si la variable a des retours à la ligne:les sorties:
printf '%s\n'
est d'éviter les problèmes avec les caractères d'échappement: /programming//a/40423558/895245 par exemple:sorties
\
comme prévu.Voir aussi: /programming/1405611/extracting-first-two-characters-of-a-string-shell-scripting
Testé dans Ubuntu 19.04.
la source
printf '%s' "$myvar" | cut -c2
n'est pas POSIX car la sortie deprintf
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 ellecut
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 descut
implémentations soient nécessaires pour gérer les lignes ou la longueur arbitraire). La sortie deprintf 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 verscut -c2
, vous obtenez soitb
,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 sortirb<newline>
)Avec
zsh
ouyash
, vous utiliseriez:(dans
zsh
, vous pouvez le raccourcir enprintf '%s\n' $text[3]
).la source
Vous pouvez utiliser la commande cut. Pour obtenir la 3e position:
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
la source
IFS
entrerait en jeu dans le code que vous avez publié.