J'ai un fichier appelé abc.txt avec le contenu comme suit:
1: It is a Shell script
2: There are few lines in this file
3: I am good with programming in C, but beginner in Shell
4: We are going towards end of file
5: END OF FILE
Je veux lire chaque fichier de manière itérative et, à chaque itération, comparer la ligne "Je suis doué pour la programmation en C, mais débutant en Shell", puis effectuer certains traitements.
Toute aide serait grandement appréciée. Merci!
Essayez cet exemple de code pour vous aider à identifier et à modifier en fonction de vos besoins:
#!/usr/bin/env bash
set -e
set -x
while read -r linenum line
do
if [ "$line" = "I am good with programming in C, but beginner in Shell" ]
then
# Process things here
echo "same"
fi
done < "$1"
Usage:
Rendre exécutable:
chmod +x script.sh
Placez le script dans n’importe quel dossier, puis exécutez le script en lui passant un fichier:
./script.sh /path/to/data.txt
Info:
-r
: L'option passée à la commande read empêche l'interprétation des échappements de barre oblique inverse.set -e
: Option Bash pour arrêter le script à la première erreur.set -x
: Option Bash utilisée pour déboguer le scrtip."$1"
: la variable de fichier transmise au script dans ce cas data.txt
linenum
: variable qui contient les numéros de ligne lorsque bash divise les lignes lues en deux variables, tandis que l’autre est transmise via la variable lin
.L'utilisation d'une boucle Shell n'est pas nécessaire, car grep
itère déjà sur des lignes:
grep '^[0-9]: I am good with programming in C, but beginner in Shell' input.txt
S'il y a une ligne correspondante, elle sera imprimée. [0-9]
définit la plage de caractères à rechercher. Nous pouvons également étendre cela à des nombres plus longs [0-9]*:
(et je pense qu'avec l'option Perl regex -P
, on pourrait le faire sous la forme [0-9]+:
).
Si une boucle Shell est vraiment nécessaire, nous pouvons utiliser l'instruction case
pour la recherche de modèle
while IFS= read -r line; do
case $line in
*": I am good with programming in C") echo "Matched: $line";;
esac
done < input.xt