web-dev-qa-db-fra.com

Comment inclure un caractère d'espace avec grep?

J'ai un fichier nommé exemple

$ cat example

kali.pdf
linux.pdf
ubuntu.pdf
example.pdf.
this.pdf
grep .pdf

et quand j'utilise grep pour obtenir la ligne qui a un espace avant .pdf, je n'arrive pas à l'obtenir.

grep *.pdf example

ne renvoie rien (je veux dire "grep, correspond à zéro ou plusieurs espaces avant .pdf", mais aucun résultat)

et si j'utilise:

grep i*.pdf example

kali.pdf
linux.pdf
ubuntu.pdf
example.pdf.
this.pdf
grep .pdf

toutes les lignes reviennent, parce que je dis "grep, correspond moi i une fois ou zéro, ok."

et enfin:

grep " *.pdf" example

aucun résultat ne revient

Pour cet exemple, je veux voir

grep .pdf 

en sortie

Quel est le problème avec ma pensée?

9
solfish

Assurez-vous de citer votre expression. Je pense que l'écriture de mots de Shell est l'un de vos problèmes ici, mais vous devriez toujours citer votre regex, car toutes sortes de choses vont mal se passer autrement.

$ grep ' \.pdf' example
grep .pdf

Ou s'il peut y avoir plusieurs espaces (nous ne pouvons pas utiliser * car cela correspond aux cas où il n'y a pas d'espaces précédents)

grep ' \+\.pdf' example

+ signifie "un ou plusieurs caractères précédents". Dans BRE, vous devez y échapper avec \ pour obtenir cette fonction spéciale, mais vous pouvez utiliser ERE pour éviter cela.

grep -E ' +\.pdf' example 

Vous pouvez également utiliser \s dans grep pour désigner un espace.

grep '\s\+\.pdf' example

Nous devrions échapper au littéral . car dans regex . désigne n'importe quel caractère, à moins qu'il ne s'agisse d'une classe de caractères.

18
Zanna