SED: plusieurs modèles sur la même ligne, la façon de faire correspondre/analyser la première
J'ai un fichier qui détient des données de numéros de téléphone, et aussi quelques trucs inutiles.
Je suis en train d'analyser les chiffres, et quand il est à seulement 1 numéro de téléphone /de la ligne, ce n'est pas le problème.
Mais quand j'ai plusieurs numéros, sed correspond à la dernière (même si partout il est dit qu'il doit correspondre seulement le premier modèle?), et je ne peux pas obtenir d'autres numéros..
Mon data.txt:
bla bla bla NUM:09011111111 bla bla bla bla NUM:08022222222 bla bla bla
Quand je parse pour les données, mon idée était d'abord de supprimer tous les "initiale" "bla bla bla" devant le premier numéro de téléphone (donc, je recherche pour la première occurrence de " NUM:'), puis-je supprimer tous les trucs après le numéro de téléphone, et d'obtenir le nombre.
Après ça, je veux analyser la prochaine occurrence de, les restes de la chaîne.
Alors maintenant, quand j'essaie de sed, je reçois toujours le dernier numéro de la ligne:
>sed 's/.*NUM://' data.txt
08022222222 bla bla bla
>
Surtout j'aimerais comprendre quel est le problème avec ma compréhension de la SED. Bien sûr, plus efficace suggestions sont les bienvenues!
N'est pas de ma commande sed-dire, remplacer tous les trucs d'avant "NUM": "" (vide)? Pourquoi il correspond toujours à la dernière occurrence ?
Merci!
.*
.+1 pour les données de l'échantillon, les implicites, les résultats attendus ET un exemple de code qui ne fonctionne pas. Bonne chance.
OriginalL'auteur julumme | 2012-03-13
Vous devez vous connecter pour publier un commentaire.
Cela pourrait fonctionner pour vous:
Le problème que vous avez est de comprendre que la
.*
est gourmand c'est à dire qu'elle correspond le plus long match de pas le premier match. En plaçant un caractère unique (\n
sed utilise comme un délimiteur de ligne de sorte qu'il ne peut pas exister dans la ligne) en face de la chaîne qui nous intéresse (NUM:...
) et la suppression de tout ce qui n'est pas le caractère unique[^\n]*
suivie par le caractère unique\n
, nous avons effectivement diviser la chaîne en morceaux maniables.Wow qui répond à mes heures de recherche pour un exemple de caractère-par opposition à la ligne de base sed travail. Je vois que nous coller le caractère de saut de ligne comme un marqueur dans la ligne à base de modèle de l'espace, puis enlever les parties qui se terminent par ce marqueur pour contrer sed gourmand match de.
OSX: Le '\n' ne fonctionne pas pour le sed. L'utilisation de 'gsed' (installable avec Brew) à la place.
OriginalL'auteur potong
Comme vous le savez maintenant,
sed
regexes sont avides et aussi loin que je peux dire ne peut pas être non-greedy.Deux alternatives qui n'ont pas été portées jusqu'à maintenant sont simplement utiliser d'autres outils pour ce genre de correspondance/extraction.
Vous pouvez utiliser
perl
que d'une baisse-dans le remplacement pour les sed avec le-pe
paramètres. Il prend en charge la?
non-greedy modificateur:Vous pouvez utiliser le
-o
option pour GNU grep pour obtenir uniquement les bits de vos données qui correspondent à l'expression régulière:Merci pour le egrep suggestion. Trop mauvais sed se limite à répéter des espaces de prendre des lignes entières.
OriginalL'auteur Eduardo Ivanec
Si un nombre est défini par les chiffres à la suite d'une
NUM:
:Ce que ce n'est:
\n
à la fin de la ligne d'agir comme un marqueur.Il peut également être fait dans l'autre sens, en supprimant d'abord les lignes sans les nombres:
Il n'y a qu'un seul appel à
sed
, seulement un peu plus complexe script avec 6 commandes. Vous avez raison, potong la solution n'avez que 3 commandes, mais ces commandes sont exécutées plusieurs fois (lag
argument de las
de commande), de sorte qu'il ne signifie pas qu'il est plus rapide. Je suis d'accord que c'est un peu plus élégante à ce problème.OriginalL'auteur jfg956
Vous pouvez utiliser ce modèle:
OriginalL'auteur kev