2017-10-06 3 views
-1

Je veux trouver des fichiers qui sont des scripts et je dois obtenir de ces fichiers la liste de tous les interprètes comme Bash, sh, etc.Échapper # dans BRE regex

Pour cela, j'utiliser:

grep "#!/bin/*" ./* 

mais il affiche que:

-bash: !/bin/*": event not found 

Je suppose que je dois échapper # symbole en quelque sorte, mais je ne trouve pas ce symbole à échapper à la documentation du BRE.

Et comment puis-je trouver les fichiers qui contiennent ce motif dans regex seulement sur la première ligne du fichier?

+0

Notez que vous pouvez désactiver [l'expansion de l'histoire] (https://www.gnu.org/software/bash/manual/html_node/History-Interaction .html) en utilisant 'set + H', qui peut par exemple être ajouté à votre' .bash_rc'. Je ne publierai pas cela comme une réponse parce que vous ne devriez pas compter dessus pour que votre script fonctionne, mais comme je trouve cette fonctionnalité agaçante, j'aime la désactiver pour moi-même. – Aaron

Répondre

2
  • le # est pas de problème, vous devez échapper à la !, en Bash il se réfère à une commande précédente et doit être suivi par quelque chose, $ pour la commande précédente ou un numéro représentant l'index de la commande dans l'histoire. (Thx correction d'Aaron)

  • aussi vous pouvez changer * en .*

comme grep "#\!/bin/.*"

  • Si vous ne voulez pas échapper !, utilisez les guillemets simples comme:

    grep '#!/bin' .... 
    

vous pouvez également désactiver le match regex en utilisant -F

+0

@Aaron vous avez absolument raison! 'The' ici est déroutant. Je l'ai corrigé dans la réponse. – Kent

+0

De rien! Merci de m'avoir crédité mais il n'y a vraiment pas besoin :) – Aaron

0

Pourriez-vous s'il vous plaît essayer de suivre la commande find et laissez-moi savoir si cela aide.

find -type f -exec grep -l '#!/bin*' {} \+ 
0

Escape the ! avec \:

grep "#\!/bin/*" ./*