2013-03-27 3 views
1

Je suis nouveau à coup, et je suis en train de construire mon propre alias grep pour rechercher dans les fichiers est le script ici je CONSTRUIT:Comment le renforcement de la fonction grep personnalisée

function gia() { 
    if [ -z "$1" ]; then 
    echo "-You need to define what are you looking for-" 
    else 
    echo "-Looking for \"$1\".-" 
    if [ -z $2 ]; then 
     echo "-no path passed, searching all files-" 
     grep -i --color "$1" ./* 
    else 
     echo "-Looking in \"$2\".-" 
     grep -i --color "$1" $2 
    fi 
    fi 
} 

la deuxième option ne fonctionne pas Eh bien, si je l'essayer, je reçois cette sortie:

$$ gia 'sometext' ./*.html 
-Looking for "sometext".- 
-Looking in "./login.html".- 

Je ne ai jamais spécifié login.html, mais il a fallu un des fichiers dans mon répertoire et cherché en elle. et le grep échoue.

par exemple, si j'ai 3 fichiers dans myfiles répertoire:

1.html, 2.txt et 3.html

et 3.html a le texte "backquotes"

si je recherche comme ceci:

cd myfiles 
gia 'backquotes' 

Je reçois les résultats

-Looking for "backquotes".- 
-no path passed, searching all files- 
./3.html: <backquotes>...</backquotes> 

mais si j'étais sur la racine et la recherche comme ceci:

gia 'backquotes' ~/myfiles/*.html 

Je reçois ceci:

-Looking for "backquotes".- 
-Looking in "./1.html".- 

aucun résultat est revenu parce qu'il recherché seulement dans 1.html. si j'avais des "backquotes" dans 1.html. il reviendra, mais je ne reçois rien des autres fichiers, il ne fait que chercher dans le premier fichier et quitte.

Je sais que l'étoile est un caractère spécial dans bash, mais comment puis-je résoudre ce problème?

Merci pour votre aide à l'avance.

EMMNS

+0

Montrez-nous comment vous appeler 'gia'. D'après les apparences, $ 2 semble avoir la valeur './login.html' – Tuxdude

+0

mis à jour mon poste – EMMNS

+0

alternativement vous pouvez utiliser 'trouver $ dir_name -name" $ ​​file_name_pattern "-exec grep -i --color = auto" $ string_to_grep "{} \;' – Alex

Répondre

2

Vous pouvez raccorder tous les arguments à partir de 2 à [email protected] en utilisant la notation ${@:2}. Également citer le "${@:2}" puisque vos noms de fichiers peuvent inclure des espaces et des caractères spéciaux qui ont besoin d'échapper.

Cela devrait fonctionner:

function gia() { 
if [ -z "$1" ]; then 
    echo "-You need to define what are you looking for-" 
else 
    echo "-Looking for \"$1\".-" 
    if [ -z $2 ]; then 
     echo "-no path passed, searching all files-" 
     grep -i --color "$1" ./* 
    else 
     echo "-Looking in \"${@:2}\".-" 
     grep -i --color "$1" "${@:2}" 
    fi 
fi 
} 

Sortie:

$ gia ABC file*.html 
-Looking for "ABC".- 
-Looking in "file1.html file 2.html file 3.html file4.html file5.html".- 
file 2.html:ABC 
file 3.html:ABC 
file5.html:ABC 
+0

génial, c'est ce dont j'avais besoin, merci @Tuxdude, mais je pense que je vais supprimer la 2ème déclaration d'écho, puisque si j'ai 300 fichiers (comme dans mon cas maintenant), la page est remplie de noms de fichiers, ,, un peu ennuyeux ... mais il fait le travail – EMMNS

2

Si vous allez utiliser des noms de fichiers « génériques » à la fonction puis $ @ doit être analysé. C'est la liste des paramètres de la fonction. J'ai laissé l'analyse du chemin hors de cette solution pour le moment.

function gia() { 
    if [ -z "$1" ]; then 
    echo "-You need to define what are you looking for-" 
    else 
     for f in [email protected] 
     do 
     grep -i --color "$f" ./* 
     done 
    fi 
    fi 
} 
+0

ouais, je comprends que, mon problème est : lorsque je spécifie le chemin, le grep échoue, et je ne récupère pas les résultats, je vais éditer mon post avec plus d'explications – EMMNS

+0

ok je comprends maintenant - essayez d'utiliser des guillemets simples autour de * .html. – suspectus

+0

Je l'ai fait, je n'ai pas récupéré de resutls :( – EMMNS

Questions connexes