-1
votes

Expression régulière pour sélectionner un mot particulier lorsqu'il n'est pas suivi d'un modèle particulier?

J'ai une liste des données de ce format: xxx

J'ai besoin de sélectionner eth1 (qui est le premier mot et c'est un mot qui est toujours Démarre avec E ) Il n'est pas suivi par 127.0.0.1 (qui pourrait également apparaître plus loin dans la ligne suivante).

ICI ETH0 n'est pas qualifié car il est suivi de 127.0.0.1

J'ai tout essayé et rien ne semble fonctionner. Est-ce même possible avec une expression régulière? Si oui, alors comment?


2 commentaires

Quelle est votre sortie attendue du texte ci-dessus et de quelle est votre plate-forme?


J'ai une liste des données ci-dessus, ma sortie attendue, mon apparence [ETH0, ETH1, ETH2] etc et la plate-forme est Linux Ubuntu.


3 Réponses :


1
votes

Pas sûr des détails de la mise en œuvre Ubuntu, mais vous pouvez utiliser un lookahead négatif:

^eth\d+(?=:)(?!.*\n.*[^0-9]127\.0\.0\.1[^0-9])
  • ^ eth \ d + (? =::) code> - le début de la ligne doit être "ETH", suivi d'un ou plusieurs chiffres et suivi d'un point de côlon mais ne capturez pas le côlon
  • (?!. * \ n. * [^ 0-9] 127 \ .0 \ .0 \ .1 [^ 0-9]) code> - Assurez-vous que le contenu suivant Le match précédent ne contient pas "127.0.0.1" LI> ul>

    https://regex101.com/r/neann/1 p> p>


23 commentaires

@rahulkushwaha Essayez le nouveau lien, il y avait une faute de frappe dans les données précédentes


Pouvez-vous s'il vous plaît expliquer cela à moi?


J'ai besoin d'une explication de ce (?! 0 \ .0 \ .1. *) Mais a échoué! Pourriez-vous développer (?! * \ n. * 127 \ .0 \ 0,0 \ .1) ?


Et pourquoi (?! (. | \ n) * 127 \ .0 \ .0 \ .1 (. | \ n) *) a échoué?


@rahulkushwaha Merci, votre commentaire m'a fait penser à une amélioration de la regex. Découvrez la mise à jour.


@rahulkushwaha Si vous avez besoin d'une explication de la syntaxe étape par étape, alors passez votre souris sur la regex au lien REGEX101.


@rahulkushwaha ne jamais utiliser (. | \ n) * , c'est toujours une mauvaise idée. . (généralement) peut correspondre à des chevrefeaux à condition que la bonne option soit passée avec le motif de regex.


@rahulkushwaha Je ne sais pas pourquoi (?! (. | \ n) * 127 \ 0,0 \ .0 \ n) *) a échoué pour vous. Cela fonctionne à Regex101.com/r/427AMJ/1 . Vous devriez envisager de fournir un lien Regex101 chaque fois que vous avez un problème. Cependant, il est incroyablement plus coûteux d'utiliser cette syntaxe.


@rahulkushwaha la raison que (?! * 127 \ 0,0 \,0 \ .1. *) échoue est parce que par défaut la période . ne capture pas de nouvelles lignes Je m'assurais manuellement d'affirmer manuellement une nouvelle ligne avec \ n


(?! (. | \ n) * 127 \ 0,0 \ .0 \ .1 (. | \ n) *) Cela a fonctionné je l'appliquait mal, comme ce e [^ \ t \ n] *: ((((((((((((| | \ n) * 127 \ 0,0 \ 0 \ .1) (. | \ n) *)) . Cela a fonctionné quand j'ai appliqué comme ce e [^ \ t \ n] *: (?! (. | \ N) * 10 \ .106 \ 0,208 (. | \ N) *) . Mais la raison exacte de l'échec n'est pas claire, pouvez-vous souligner?


Je m'attends à ce que cela fonctionne bien sur le site Web Regeux101 puisque vous semblez l'avoir testé là-bas, mais cela ne fonctionnera pas dans un outil unix standard. Je suis surpris que l'OP l'accepte comme la meilleure réponse.


@RAHULKUSHWAHA \ t et \ n correspond à une onglet Char et d'une nouvelle ligne de caractères respectivement. Je recommande d'utiliser le site REGEX101 pour obtenir une compréhension de base de la syntaxe Regex.


@Edmorton La saveur de regex et les outils disponibles étaient inconnus au moment de ma réponse que j'ai adressé dans ma phrase d'ouverture. Les utilisateurs sont encouragés à accepter des réponses qui les ont la plus aidés. OP est plus que bienvenu pour changer la réponse acceptée si ma réponse ne les aidait pas à atteindre leur objectif.


Droite, il n'y a rien de mal avec votre réponse. Comme je l'ai dit, je suis sûr que cela fonctionnera très bien sur REGEX101, je suis surpris que le PO l'acceptait (et si efficacement décourageait les autres d'afficher des réponses) étant donné qu'il ne fonctionnera pas dans un outil Standard UNIX (Lookaheads et < Code> \ d sont les problèmes) et du commentaire qu'ils semblent toujours lutter pour le faire fonctionner à l'aide de tout outil qu'ils utilisent.


@Edmorton Je ne suis vraiment pas sûr. Basé sur leurs commentaires, on dirait que leur outil supporte des lunettes de vue. Apparemment, je devinais correctement, j'ai évoqué votre réponse car ce serait la bonne réponse si OP utilise awk .


Merci. Je pense que c'est plus probable que leur outil ne supporte pas les lunettes de vue et l'interprétation de la syntaxe Lookahead comme autre chose (par exemple, peut-être ( est interprété comme le début d'un groupe de capture et ? comme des répétitions zéro ou une, etc.) qui n'arrivent pas à ne pas échouer et produisent la sortie attendue pour le cas d'utilisation d'un échantillon. Mais sans savoir quel outil utiliser l'OP, nous devinons tous seulement ...


@Edmorton me bat. Si votre (? La théorie est correcte, je me demande comment le suivant! ne provoque pas de défaillance.


IDK, ma meilleure hypothèse est que l'OP a eu un test différent contre une entrée différente et met mal interprété les résultats. Avez-vous Avis L'OP a changé d'adresses IP dans le REGEXP qu'ils ont déclaré fonctionner?


@Edmorton Les incohérences entre les questions et les commentaires se produisent dans probablement 95% des postes que je traite, donc j'ai appris il y a longtemps pour ne pas perdre de sommeil dessus.


En fait, je exécute la commande dans le python et obtenez la sortie en python et appliquez une expression régulière! Initialement, je voulais utiliser cela dans la coquille d'Ubuntu, mais le fait que je ne pouvais tout simplement pas écrire la regex dans Regex101.com m'a irrité, alors mon accompagnement m'a été construit pour écrire une expression régulière. En fait, je voulais accepter à la fois la réponse, mais Stackoverflow ne le permet pas, alors j'ai évoqué tout ce que je pouvais. s'il vous plaît ne me méprenez pas, je ne veux pas décourager personne


@RAHULKUSHWAHA Pas de problème mais FYI Il n'y a pas de "une expression régulière": il y a des bres, des ers et des pcrès. Il existe des outils qui utilisent l'un de ceux par défaut, un autre avec un argument, des outils qui lisent une ligne à la fois, des outils qui lisent des blocs multilignes donnés des arguments, des outils prenant en charge les rafraîchies, des outils qui ne sont pas des outils spécifiques. Les délimiteurs qui ne peuvent pas apparaître ou doivent être échappés à l'intérieur du regexp, des outils avec plusieurs fonctions REGEXP, des outils avec des extensions aux normes POSIX ERE, etc., etc.


... Donc, ne demandez donc jamais à "une expression régulière" comme cela pourrait signifier à peu près n'importe quoi (et est souvent la mauvaise approche de toute façon - Certaines personnes, lorsqu'elles sont confrontées à un problème, pensez-moi" que je sais, je vais utiliser des expressions régulières. "Maintenant, ils ont deux problèmes. .


@rahul Oh d'accord, ça a du sens. J'ai eu le sentiment que vous aviez un accès à une implémentation PCRE. Glad ma solution travaillait pour vous!



2
votes

Vous pouvez utiliser cette commande awk code> disponible de manière native sur Ubuntu: xxx pré>

explication: strong> p>

-F ': '  # make ": " as input delimiter
$1 ~ /^e[[:alnum:]]+$/ && NF==2 { # if $1 starts with e and has 1+ alphanumeric characters later and there are exactly 2 fields in that line
   s=$1      # save $1 in var s
   p=NR      # save record no in var p
}
NR==p+1 && !/ 127\.0\.0\.1[[:blank:]]/ { # we are processing (p+1)th record and it doesn't have " 127.0.0.1 " in it
   print s   # print s
}


4 commentaires

Mais le mot sélectionné doit toujours commencer par E et après avoir peut-être un nombre de lettres que : .


ya! ça marche. Pourriez-vous s'il vous plaît expliquer cela à moi?


La syntaxe de commande awk est options AWK 'Sélection _criteria {action}' mais je suis incapable de trouver cette structure dans votre code?


J'ai ajouté une explication dans ma réponse.



2
votes
$ awk -v RS= -F':' '!/[[:space:]]127\.0\.0\.1[[:space:]]/{print $1}' file
eth1
That will work using any POSIX awk in any shell on every UNIX box.

0 commentaires