lignes grep commençant par «1» dans Ubuntu

47

J'essaie de rechercher des lignes commençant par "1" en utilisant

ls -1 | grep ^1*

mais il retourne des lignes qui ne commencent pas par 1. Qu'est-ce qui me manque ici?

Tim
la source
Juste une autre remarque: si vous voulez utiliser grep pour limiter la lssortie, vous rencontrerez des problèmes si les noms de fichiers contiennent des caractères étranges, tels que des nouvelles lignes ... De nombreuses autres commandes ( lsdu moins pas, du moins pas la version que je dois vérifier) avoir une option pour donner une sortie séparée null, que vous pouvez ensuite traiter en toute sécurité avecgrep -z
Gert van den Berg
Merci, @GertvandenBerg! Quels problèmes certains personnages étranges, tels que les nouvelles lignes, peuvent-ils causer à grep? Quelles commandes donnent une sortie séparée nulle?
Tim
1
find avec -print0, la plupart des autres outils GNU ont une option -0 ou -z. (triez, xargs, etc. aussi). Si les noms de fichiers contiennent des nouvelles lignes, il serait impossible de savoir si deux lignes constituent un nom de fichier contenant une nouvelle ligne ou deux noms de fichiers distincts.
Gert van den Berg

Réponses:

68

Votre expression habituelle ne signifie pas ce que vous pensez que cela fait. Il fait correspondre toutes les lignes commençant (^) avec un (1) zéro ou plusieurs fois (*) répété. Toutes les chaînes correspondent à cette expression régulière. grep '^1'fait ce que tu veux.

Otokan
la source
33

Avez-vous essayé ce qui suit?

 ls -1 | grep "^1"

En d’ autres termes , supprimez-en ce *qui indique essentiellement que vous greptrouvez zéro ou plusieurs occurrences de l’ ^1expression. En d'autres termes: faites correspondre les lignes qui commencent par un 1 ou non.

Bernhard
la source
13

Bien que cela ne réponde pas à votre question, il s'agit d'une meilleure solution à ce qui semble être votre objectif:

ls -ld 1*

Vous pouvez utiliser un shell glob pour lister tous les fichiers qui commencent par 1. Notez que la *signification de l'éclat du shell est différente de celle des expressions régulières.

Jordan
la source
Merci! +1 Comment * a-t-il un sens différent dans le globgling du shell et dans les expressions régulières?
Tim
2
Dans un glob shell * est un caractère générique qui signifie « 0 ou plus de tout caractère ». La signification de l'expression rationnelle est expliquée dans la réponse d'otokan.
jordanm
3

^ 1. * correspond à la ligne entière ou, comme indiqué ci-dessus, ^ 1 a obtenu la chaîne contenue dans la ligne.

différents styles de regex utilisent différents symboles représentant des caractères, certaines options spécifient le style souhaité. et différentes options spécifient si vous souhaitez faire correspondre toute la ligne, ou seulement une partie de celle-ci, ou toute l'entrée en une seule chaîne.

Shellukolle
la source