Utilisez grep pour faire correspondre un motif dans une ligne une seule fois

J’ai ceci:

echo 12345 | grep -o '[[:digit:]]\{1,4\}' 

Ce qui donne ceci:

 1234 5 

Je comprends ce qui se passe. Comment puis-je empêcher grep d’essayer de continuer à correspondre après une correspondance réussie?

Comment puis-je obtenir seulement

 1234 

Vous devez faire le regroupement: \(...\) suivi du nombre exact d’occurrences: \{\} pour faire le travail:

 maci:~ san$ echo 12345 | grep -o '\([[:digit:]]\)\{4\}' 1234 

J’espère que cela aide. À votre santé!!

Voulez-vous que grep cesse de correspondre ou que vous ne vous souciez que du premier match? Vous pourriez utiliser la head si le dernier est vrai …

 `grep stuff | head -n 1` 

Grep est une utilitaire basée sur les lignes, donc le drapeau -m 1 dit à grep de s’arrêter après la première ligne qui, combinée avec head, est plutôt bonne en pratique.

Utilisez sed au lieu de grep :

 echo 12345 | sed -n '/^\([0-9]\{1,4\}\).*/s//\1/p' 

Cela correspond à 4 chiffres au début de la ligne, suivis de tout ce qui rest, ne conserve que les chiffres et les imprime. Le -n empêche les lignes d’être imprimées autrement. Si la chaîne de chiffres peut également apparaître en milieu de ligne, vous avez besoin d’une commande légèrement plus complexe.

En fait, idéalement, vous utiliserez une sed avec des expressions régulières PCRE, car vous avez vraiment besoin d’une correspondance non gourmande. Cependant, jusqu’à une approximation raisonnable, vous pouvez utiliser: ( Une solution partielle à un problème beaucoup plus complexe … maintenant supprimé! )

Comme vous voulez que la première chaîne de 4 chiffres au maximum figure sur la ligne, utilisez simplement sed pour supprimer tous les caractères autres que des chiffres, puis imprimez la chaîne de chiffres:

 echo abc12345 | sed -n '/^[^0-9]*\([0-9]\{1,4\}\).*/s//\1/p' 

Cela correspond à une chaîne de non-chiffres suivie de 1 à 4 chiffres suivis de tout ce qui ne garde que les chiffres et les imprime.

Si – comme dans votre exemple – votre expression numérique apparaîtra au début de la chaîne que vous commencez, vous pouvez simplement append une ancre de début de ligne ^ :

 echo 12345 | grep -o '^\([[:digit:]]\)\{1,4\}' 

Selon les chiffres exacts que vous souhaitez, une ancre $ fin de ligne pourrait également vous aider.