Comment puis-je avoir une liste qui me dit quand un mot (SecondWord dans mon exemple) est manquant quand un autre mot (FirstWord dans mon exemple) a été écrit.
File1.txt:
Bonjour FirstWord ... SecondWord
...
... FirstWord ...
FirstWord ... SecondWord
FirstWord ... ...
Bonjour ... SecondWord
File2.txt:
Bonjour FirstWord ... SecondWord
FirstWord ...
Je voudrais un fichier à la fin avec la ligne et le nom du fichier:
3: Fichier1
5: Fichier1
2: Fichier2
Je pense que ce que j'essaie de faire est exagéré: /
filename='test.txt' lineArray[0]=0 filesAwaitable[0]=$lineArray grep -r -n 'FirstWord ' Sources/ --include=\*.txt | awk -F: '{print $2":"$1}' > $filename while read line; do IFS=: ary=($line) for key in "${!ary[@]}"; do if [[ $filesAwaitable["$key"] != *"${ary[$key]}"* ]]; then filesAwaitable["$key"] = "${ary[$key]}" echo "${ary[$key]}"; fi #grep -n -r 'SecondWord' line | awk -F: '{print $2":"$1}' done done < $filename
Merci pour votre aide
3 Réponses :
Dans mon exemple, je veux savoir quand SecondWord est manquant alors que FirstWord a été écrit auparavant.
Si vous avez un
grep
qui comprend les expressions régulières perl, vous pouvez directement spécifier un modèle pour FirstWord non suivi de SecondWord n'importe où jusqu'à la fin de la ligne : p >awk -F: '{print $2,":",$1}'Cela donne pour les exemples donnés:
File1.txt:3:... FirstWord ... File1.txt:5:FirstWord ... ... File2.txt:2:FirstWord ...Pour réorganiser cela au format de sortie souhaité, vous pouvez le diriger vers p>
grep -nP 'FirstWord((?!SecondWord).)*$' File?.txt
Thx Armali, qu'est-ce que -P? semble parfait pour le faire en une seule ligne. Mais ça ne marche pas
@ B.Brigitte - -P
, --perl-regexp
˿ Interpréter PATTERN comme une expression régulière Perl. Cette option est disponible dans GNU grep ; peut-être pouvez-vous l'installer, ou je penserai à une approche sans elle (mais ce serait beaucoup plus compliqué, similaire à la vôtre - ou seriez-vous d'accord pour utiliser perl
?).
Dans le cas où une solution Perl est correcte, en voici une simple avec la même expression régulière que pour GNU grep:
find Source -name \*.txt|xargs perl â¦
Comment puis-je utiliser cette commande dans tous les dossiers Source / pour tous les fichiers .txt?
Vous pouvez utiliser find
pour cela:
perl -ne 'print "$. : $ARGV\n" if /FirstWord((?!SecondWord).)*$/; close ARGV if eof' File?.txt
(sans le File? .txt
à la fin de la perl
command).
Cela semble parfait, merci. J'ai du remplacer par -nle coz grep -P ne fonctionne plus. Comment puis-je utiliser cette commande dans tous les dossiers Source / pour tous les fichiers .txt?
@ B.Brigitte - Le remplacement du Fichier? .Txt
par sous-dossier / *. Txt
devrait être suffisant pour le faire apparaître dans tous les fichiers txt du sous-dossier i >.
qu'en est-il du sous-dossier sur le sous-dossier que je ne connais pas?
sous-dossier / *. txt s'il n'y a pas de fichier txt dans ce sous-dossier. ça crée une erreur
@ B.Brigitte - J'ai développé la réponse.
Merci beaucoup. N'aurait pas pu se passer de toi. Thx pour votre patient
Est-il possible avec find d'exclure des fichiers spécifiques?
@ B.Brigitte - Pour exclure e. g. le fichier test.txt
, on peut le faire avec: find Source -name \ *. txt! -nom test.txt…
.
Si le shell est bash
, le problème peut être résolu facilement avec le opérateur de correspondance de modèle étendu ! ( modèle )
, qui correspond à tout sauf au modèle em donné >: shopt -s extglob # enable extended pattern matching features
for file in "$@"
do lineno=0
while read line
do ((++lineno))
case "$line" in *FirstWord!(*SecondWord)) echo $lineno : $file
esac
done <$file
done
Quelle ligne dans votre exemple
File1.txt
est la ligne 5? Quel mot est le mot manquant et quel mot est un autre mot ?Bonjour, je modifie ma question pour mieux mettre en retrait. Dans mon exemple, je veux savoir quand SecondWord est manquant alors que FirstWord a été écrit auparavant.
Thx, vous avez raison. Fait