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.
3 Réponses :
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
Merci !. Cela a très bien fonctionné. Merci d'avoir suggéré l'option -P. explorera plus à ce sujet.
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'
si les données de 'd' ont été essayées sur gnu sed
sed -E 's/.*xxxx\s*\[(098)\]\s*yyyy.*/\1/' d