Comment inclure un caractère espace avec grep?

17

J'ai un fichier nommé exemple

$ cat example

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

et quand j'utilise greppour 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 iune ou zéro fois, 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?

solfish
la source

Réponses:

31

Assurez-vous de citer votre expression. Je pense que l'éclatement des mots du shell est l'un de vos problèmes ici, mais vous devriez toujours citer votre expression rationnelle, car toutes sortes de choses iront mal sinon.

$ grep ' \.pdf' example
grep .pdf

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

grep ' \+\.pdf' example

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

grep -E ' +\.pdf' example 

Vous pouvez également utiliser \sdans greppour signifier un espace

grep '\s\+\.pdf' example

Nous devons échapper littéralement .car dans regex .signifie n'importe quel caractère, à moins qu'il ne soit dans une classe de caractère.

Zanna
la source
Vous avez été le premier à remarquer que la dernière ligne avait de l'espace.
Pilot6
@ Pilot6 merci. La question a été un peu confuse :)
Zanna
Il devrait y avoir un badge pour le premier qui a compris la question ;-)
Pilot6
@Zanna, y a-t-il quelque chose qui ne va pas à tout moment egrep dans ces cas? egrep vous donne toujours un avantage ...
solfish
@solfish egrepest (en termes de style regex, afaik) le même que grep -E, et je crois que nous sommes censés utiliser ce dernier - egrepetc sont censés être dépréciés en faveur des grepdrapeaux de
Zanna