2
votes

Extraire le numéro avec des caractères spéciaux d'un fichier à l'aide de la commande sed et grep

J'essaie d'extraire le nombre entouré par les crochets après la correspondance avec le mot qui est placé après le nombre. par exemple.

Le fichier contient

sed -nr 's/.*( |^)([0-9]+) yyyy.*/\2/p' str.txt 

J'ai besoin de rechercher le yyyy et s'il correspond dans la ligne, je dois extraire le 098 lui-même.

J'essaye avec

sed 's/.*\[\([^]]*\)\].*/\1/g' str.txt

pour extraire le nombre sans correspondance de motif.

et j'utilise

xxxx [098] yyyy zzzz

pour la correspondance de motif et j'obtiens le numéro qui est placé avant cette correspondance. Mais je ne pouvais pas fusionner ces deux commandes. Je confond avec l'erreur

sed: -e expression # 1, char 26: option inconnue de `s '

Je pense que cela tient à cause de l'utilisation du / comme délimiteur plus.


0 commentaires

3 Réponses :


0
votes

Comme vous avez balisé grep, une autre option si vous pouvez utiliser gnu grep est d'utiliser l'option -P Expression régulière compatible Perl et d'utiliser des lookarounds: < pre> XXX

Cela vous donnera 098


1 commentaires

Merci !. Cela a très bien fonctionné. Merci d'avoir suggéré l'option -P. explorera plus à ce sujet.



1
votes

Vous devez toujours utiliser la logique d'impression conditionnelle dans les cas où vous décidez d ' imprimer sur une condition. Avec les prédicats -n et p , vous pouvez contrôler la commande pour imprimer le groupe correspondant uniquement si la correspondance a réussi.

Donc, en combinant vos tentatives, vous avez besoin de quelque chose comme

awk '$3 == "yyyy" { gsub(/[][]/,"",$2); print $2 }'

qui ne s'imprimera pour aucun autre cas que yyyy après la chaîne [..] .

Mais analyser un fichier à espace dé-limité est assez facile si vous décidez d'utiliser awk dans lequel votre résultat pourrait simplement être écrit comme

sed -n 's/.*\[\([^]]*\)\][[:space:]]yyyy.*/\1/p' 


0 commentaires

0
votes

si les données de 'd' ont été essayées sur gnu sed

sed -E 's/.*xxxx\s*\[(098)\]\s*yyyy.*/\1/' d


0 commentaires