2012-04-30 7 views
1

J'ai du travail à faire à bash. Cela se passe comme suit:Trouver les mots dans le bon ordre

Comme premier argument, vous tapez des mots pour le trouver dans les fichiers dans l'ordre où il est écrit, dans le deuxième argument, vous tapez le répertoire. Il doit rechercher récursivement et retourner le nom du fichier où il apparaît.

Par exemple: bash mybash "alice cat" . il doit retourner les fichiers qui contiennent par exemple: "alice a un chat", "chat alice", mais pas "chat a alice"

Je ne smething comme ce

#!/bin/bash 
pattern=".*" 

for arg in $1; do 
    pattern+="${arg}.*" 
done 

grep -r ${pattern} $2 

mais il ne recherche que ligne par ligne et ne trouve pas les fichiers avec:

« alice quelque chose d'autre »

« nouvelle ligne a un chat "

mais il devrait le retourner.

De l'aide serait appréciée.

Salutations.

+0

Je ne comprends pas pourquoi il devrait retourner "alice quelque chose d'autre" mais pas "chat a alice"? Pourquoi devrait-il retourner "alice quelque chose d'autre" quand "chat" n'est pas là? – jedwards

+0

si vous tapez dans l'argument "alice cat" il doit être dans le fichier dans le même ordre, donc il ne peut pas retourner "chat a alice" parce que "alice" est avant "cat" – tobi

+0

Je comprends mais le fichier contenant "alice quelque chose d'autre "ne contient pas de" chat "du tout. – jedwards

Répondre

1

Est-ce que

awk '/alice/,/cat/' file 

faire ce que vous voulez?

0

Si vous supprimez les nouvelles lignes dans vos fichiers, alors grep fonctionnera comme prévu.

find $2 -type f | while read file; do 
    if tr '\n' ' ' < ${file} | grep -q -r ${pattern}; then 
    echo ${file} 
    fi 
done 
+0

Quelle est la raison du chat inutile? – Jens

+1

@jens tr ne prend pas un nom de fichier comme argument. – frankc

+0

'tr -d '\ n' <" $ file "' – Daenyth

Questions connexes