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?
Vous pourriez utiliser
grep -E "^.{4}.?.?.?.?.?.?.?$pattern"
où $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édentsBash 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
.