Je dois identifier la position d'un caractère dans la chaîne à l'aide de la commande Grep.
Exemple, la chaîne est RAMSITALSKHMAN|1223333
.
grep -n '[^a-zA-Z0-9\$\~\%\#\^]'
Comment trouver la position de |
Dans la chaîne donnée?
Vous pouvez utiliser -b
Pour obtenir le décalage des octets, qui est identique à la position de texte simple (mais pas pour UTF-8 ou similaire).
$ echo "RAMSITALSKHMAN|1223333" | grep -aob '|'
14:|
Dans ce qui précède, j'utilise le -a
Basculer pour dire à Grep d'utiliser l'entrée comme texte; nécessaire pour fonctionner sur des fichiers binaires et le -o
Basculez uniquement sur le (s) caractère (s) correspondant (s).
Si vous ne voulez que la position, vous pouvez utiliser Grep pour extraire uniquement la position:
$ echo "RAMSITALSKHMAN|1223333" | grep -aob '|' | grep -oE '[0-9]+'
14
Si vous obtenez une sortie étrange, vérifiez si Grep a des couleurs activées. Vous pouvez désactiver les couleurs en passant --colors=never
au grep ou en préfixant la commande Grep avec un \
(qui va désactiver tout alias), par exemple:
$ echo "RAMSITALSKHMAN|1223333" | grep -aob '|' --color=never | \grep -oE '^[0-9]+'
14
Pour une chaîne qui retourne plusieurs matchs, pipe à travers head -n1
Pour obtenir le premier match.
Notez que j'utilise à la fois dans ce qui précède et que celui-ci ne fonctionnera pas si Grep est "aliasé" via un exécutable (script ou autre), uniquement lorsque vous utilisez des alias.
Essayer:
printf '%s\n' 'RAMSITALSKHMAN|1223333.' | grep -o . | grep -n '|'
sortir:
15:|
Cela vous donnera la position avec l'index basé sur 1.
Si vous utilisez le bash Shell, vous pouvez utiliser des opérations intégrées purement sans avoir recours à des processus externes tels que le frai grep ou awk :
$ str="RAMSITALSKHMAN|1223333"
$ tmp="${str%%|*}"
$ if [ "$tmp" != "$str" ]; then
> echo ${#tmp}
> fi
14
$
Celui-ci utilise un extension des paramètres pour supprimer toutes les occurrences de |
Suit par une chaîne et, sauf que dans une variable temporaire. Il est alors juste une question de mesurer la longueur de la variable temporaire pour obtenir l'indice de |
.
Notez le if
vérifie si le |
Existe du tout dans la chaîne d'origine. Si elle ne le fait pas alors la variable temporaire sera le même que le orginal.
Notez également cela donne l'indice de base zéro |
Qui est généralement utile lors de l'indexation des chaînes de bash. Toutefois, si vous avez besoin de l'indice à base d'un, vous pouvez le faire:
$ echo $((${#tmp}+1))
15
$
Nous pouvons également le faire en utilisant "EXPR Match" ou "Index Expr"
eXPR MATCH $ STRING $ SUBSTRING où $ SUBSTRING est un re.
echo `expr match "RAMSITALSKHMAN|1223333" '[A-Z]*.|'`
Et ci-dessus vous donnera la position car elle renvoie la longueur de la sous-chaîne correspondante.
Mais pour être plus spécifique pour la recherche d'index:
mystring="RAMSITALSKHMAN|122333"
echo `expr index "$mystring" '|'`
$ echo 'RAMSITALSKHMAN|1223333'| awk 'BEGIN{ FS = "" }{for(i=1;i<=NF;i++){if($i=="|"){print i;}}}'
15
En définissant le séparateur de champ comme une chaîne NULL, AWK tourne le caractère individuel dans l'enregistrement en tant que champs distincts.