2009-10-06 10 views
0

J'ai des fichiers texte contenant des noms, des numéros de téléphone et des codes de région. Une combinaison par ligne.Problème avec l'expression régulière utilisant grep

La syntaxe est toujours "Nom code-région"
Avec un nombre d'espaces entre les 3 variables. Ce que je veux faire est de rechercher des codes de région spécifiques, comme 23 ou 493, par exemple. Le problème est que ces chiffres peuvent apparaître dans les chiffres 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 le nombre mais pas en tant que code régional démontrerai en raison aussi ... qui est Pas correcte.

Répondre

6

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

grep ' 04 ' numbers.txt

+1

même "grep '04 'numbers.txt" –

+0

Merci. * Bounces tête contre le mur le plus proche. ** – KdgDev

-1

utiliser des limites de mots. pas sûr si cela fonctionne dans grep, mais dans d'autres implémentations regex que je l'entourent avec des motifs aux limites un espace ou un mot

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

Quelque chose comme ça

2

Je ferais:

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

et grep:

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

Si vous voulez seul code de région, vous devez utiliser:

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

de cette façon, il ne sera que chercher des nombres sur la colonne du milieu, tandis que le début ou la fin des chaînes sont considérés comme des sauts de mots.

Vous pouvez même faire:

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

remplaçant fichier avec 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 
0

Recherchez-vous un code de région entier ou un code de région qui contient le sous-masque?

Si vous voulez le code de 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 région spécifique. Il existe d'autres façons d'indiquer les limites de mots en utilisant des expressions régulières.

grep ' 04 ' numbers.txt 

S'il peut y avoir des espaces dans les champs de nom ou de numéro de téléphone, cette solution risque de ne pas fonctionner. En outre, si vous le motif peut être une sous-partie du code de la région, alors awk est un meilleur outil. Cela suppose que le champ 'nom' ne contient aucun espace. L'opérateur correspondant '==' requiert que le motif corresponde exactement au champ. Cela peut être difficile quand il y a des espaces de chaque côté du terrain.

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

Si le fichier est un séparateur, que ce qui peut être mis en awk en utilisant l'argument de la « -F » à awk pour définir le caractère de séparateur de champ. Dans cet exemple, une virgule est utilisée comme séparateur de champs. En outre, l'opérateur correspondant dans cet exemple est un '~' permettant 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 facultative, si vous voulez que la ligne complète à imprimer. Cependant, si vous voulez faire un formatage sur la sortie, cela peut être fait à l'intérieur de ce bloc.

Questions connexes