web-dev-qa-db-fra.com

Comment effectuer une recherche dans une plage spécifique de positions sur une ligne

J'ai un fichier texte qui a 60 positions de caractères. Je veux pouvoir rechercher une valeur/un mot saisi par l'utilisateur aux positions 05-12. Comment puis-je faire cela sans utiliser awk, pearl, etc.?

Par exemple, le fichier texte est

commA6314   ifosfamide               30     12 

home5341209 urokinase    6314               37

Et si quelqu'un entre 6314, alors il afficherait la ligne

commA6314   ifosfamide               30     12

Je pensais utiliser grep, mais pas trop. De l'aide?

3
JVAN

Vous pourriez utiliser

grep -E "^.{4}.?.?.?.?.?.?.?$pattern" 

$pattern est l'entrée de l'utilisateur, je veux dire quelque chose comme

$ echo "enter a pattern: "; read pattern; grep -E "^.{4}.?.?.?.?.?.?.?$pattern" file
enter a pattern: 
6314
commA6314   ifosfamide               30     12 

^.{4}.?.?.?.?.?.?.? c'est les 4 premiers caractères verrouillés, alors les 7 prochains caractères sont facultatifs, ce qui signifie que si le motif ne contient qu'un seul caractère et qu'il est en 12ème position, il sera trouvé et s'il est composé de 7 caractères et commence à partir du 5ème position, il serait toujours trouvé.

  • ^ début de ligne
  • . n'importe quel caractère
  • {4} quatre du caractère précédent
  • ? zéro ou un des caractères précédents
2
Zanna

Bash permet d'extraire des sous-chaînes d'une variable spécifique. Tout ce que vous avez à faire est de lire le fichier ligne par ligne dans la structure while IFS= read -r:

#!/bin/bash
while IFS= read -r line;
do
    if [[ ${line:5:12} =~ "$1" ]];
    then
        echo "$line"
    fi
done < "$2"

Notez la syntaxe: dans ${var:5:12} 5 est la position de départ et 12 est décalé. Dans ce cas, la recherche est effectuée entre les positions de caractères 5 à 17. Si vous avez besoin de calculer le décalage en fonction des entrées de l'utilisateur, vous pouvez utiliser l'arithmétique bash. pour déterminer un décalage comme end=$((12-5)) et utiliser cette variable dans une expression de sous-chaîne telle que ${var:5:$end}

Essai:

$ ./search_substrings.sh "6314" input.txt                                                                                
commA6314   ifosfamide               30     12  

Notez que cela évite d’utiliser des outils externes tels que grep qui respecte les exigences, mais gardez à l’esprit que ce n’est pas une solution très pratique, et dans le monde réel, vous préférez utiliser Perl ou awk.

1