web-dev-qa-db-fra.com

Comment obtenir le char à une position donnée d'une chaîne dans le script shell?

Comment obtenir le char à une position donnée d'une chaîne dans le script shell?

23
Tom Brito

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
37
forcefsck

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
6
dogbane

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]).

1
Stéphane Chazelas

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
0
Midhun Jose