0 votes

Problème avec une expression régulière utilisant grep

J'ai des fichiers texte qui contiennent des noms, des numéros de téléphone et des codes régionaux. Une combinaison par ligne.

La syntaxe est toujours "Nom Région_code numéro".
Avec un nombre quelconque d'espaces entre les 3 variables.

Ce que je veux faire, c'est rechercher des codes régionaux spécifiques, comme 23 ou 493, par exemple. Le problème est que ces numéros peuvent également apparaître dans les numéros plus longs, ce qui pourrait permettre un retour qui n'aurait pas dû être retourné.

Je pensais à ce genre de commande :
grep '04' numbers.txt

Mais si je fais cela, une ligne qui contient 04 dans le numéro mais pas comme code de région apparaîtra aussi comme résultat... ce qui n'est pas correct.

6voto

DigitalRoss Points 80400

Je suis sûr que vous êtes sur le point d'être submergé par des expressions régulières astucieuses, mais je pense que dans ce cas, tout ce que vous devez faire est d'inclure un des espaces de chaque côté de votre code de région dans le grep.

grep ' 04 ' numbers.txt

2voto

yogsototh Points 3971

Je le ferais :

awk '$2 == "04"' < numbers.txt

et avec grep :

grep -e '^[^ ]*[ ]*04[ ]*[^ ]*$' numbers.txt

1voto

Asrail Points 90

Si vous voulez uniquement les codes régionaux, vous devez utiliser :

grep "[[:space:]]04[[:space:]]"

de cette façon, il ne cherchera que les chiffres de la colonne du milieu, tandis que le début ou la fin des chaînes de caractères sont considérés comme des coupures de mots.

Vous pouvez même le faire :

function search_region_codes {
   grep "[[:space:]]${1}[[:space:]]" FILE
}

en remplaçant FICHIER par le nom de votre fichier,

et utiliser

search_region_codes 04

ou même

function search_region_codes {
   grep "[[:space:]]${1}[[:space:]]" $2
}

et en utilisant

search_region_codes NUMBER FILE

0voto

Rich Points 16818

Utilisez les limites des mots. Je ne sais pas si cela fonctionne avec grep, mais dans d'autres implémentations de regex, je l'entourerais d'espaces ou de motifs de limites de mots.

'\s+04\s+' or '\b04\b'

Quelque chose comme ça

0voto

Stan Graves Points 4017

Cherchez-vous un code régional entier ou un code régional qui contient le sous-modèle ?

Si vous voulez le code de la région entière et qu'il y a au moins un espace de chaque côté, vous pouvez formater le grep en ajoutant un espace unique de chaque côté du code de la région spécifique. Il existe d'autres moyens d'indiquer les limites des mots à l'aide d'expressions régulières.

grep ' 04 ' numbers.txt

S'il peut y avoir des espaces dans les champs du nom ou du numéro de téléphone, cette solution risque de ne pas fonctionner. De même, si le motif peut être une sous-partie du code de la région, awk est un meilleur outil. Cela suppose que le champ "nom" ne contient pas d'espaces. L'opérateur de correspondance "==" exige que le motif corresponde exactement au champ. Cela peut s'avérer délicat lorsqu'il y a des espaces de part et d'autre du champ.

awk '$2 == "04" {print $0}' < numbers.txt

Si le fichier a un délimiteur, celui-ci peut être défini dans awk en utilisant l'argument '-F' à awk pour définir le caractère de séparation des champs. Dans cet exemple, une virgule est utilisée comme séparateur de champ. En outre, l'opérateur de correspondance dans cet exemple est un '~', ce qui permet au motif d'être n'importe quelle partie du code de région (si cela est applicable). Le "/y" est un moyen de faire correspondre les limites de travail au début et à la fin de l'expression.

awk -F , '$2 ~ /\y04\y/ {print $0}' < numbers.txt

Dans les deux exemples, le {print $0} est optionnel, si vous voulez que la ligne entière soit imprimée. Cependant, si vous souhaitez effectuer un quelconque formatage de la sortie, vous pouvez le faire à l'intérieur de ce bloc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X