2012-06-04 5 views
1

Je veux analyser le résultat d'une commande grep dans un navigateur. Quelque chose comme grep -nriI "hello" myFolder Le résultat est une chaîne multiligne:analyser le résultat de grep dans un navigateur avec javascript

 
/home/user/folder/file1:1:hello world 
/home/user/folder/file2:1:world hello 
/home/user/folder/folder/file3:1:bonjour=hello 

D'abord, je diviser les lignes d'avoir un tableau. Et analyser avec cette regex: /^(.*?)\:(\d*)\:(.*?)$/

J'ai quelques problèmes.

  1. Parse ne fonctionnera pas pour résultat avec drôle ombles comme point double (:)
  2. Quand je grep un fichier, je ne reçois pas pah:line number:content mais seulement line number:content il faire la regex plus complexe (il n'y a pas nommé groupe dans javascript regex).

A quelqu'un déjà un bon analyseur ou un projet qui l'analyse. Il doit fonctionner dans un navigateur ...

Je vais faire un jsfiddle.

Répondre

3

Mon grep (sur Ubuntu Linux) a quelques options qui pourraient aider, même si aucun d'eux n'est standard POSIX.

Pour une sortie ambiguë:

-Z, --null 
      Output a zero byte (the ASCII NUL character) instead of the character 
      that normally follows a file name. For example, grep -lZ outputs a zero 
      byte after each file name instead of the usual newline. This option 
      makes the output unambiguous, even in the presence of file names 
      containing unusual characters like newlines. This option can be used 
      with commands like find -print0, perl -0, sort -z, and xargs -0 to 
      process arbitrary file names, even those that contain newline characters. 

Pour le nom du fichier manquant:

-H, --with-filename 
      Print the file name for each match. This is the default when there is 
      more than one file to search. 

Il faut donc utiliser grep -nriIHZ et mettre à jour votre regex à quelque chose comme ça (non testé):

/^(.*)\0(\d+):(.*)$/ 
+0

Le grep est fait sur le serveur, puis-je transférer le \ 0 au client? Je l'essaie et actuellement \ 0 n'apparaît pas dans la réponse du serveur. – Charles

+0

Cela devrait être possible. Tous les spectateurs ne montrent pas correctement les octets nuls. Essayez de l'exécuter à travers une visionneuse hexadécimale pour être sûr que vous voyez la sortie correctement. – Thomas

+0

ouais ça marche :) comme vous l'avez dit '' '' grep -nriIHZ''' avec '' '/^(. *) \ 0 (\ d +): (. *) $ /' '' Parfait. La console réseau de chrome ne l'affiche pas mais le caractère ASCII NULL est présent. – Charles

1

code:

var regex = /^([^:]*):([^:]*):([^:]*)$/; 
var lines = [ 
    '/home/user/folder/file1:1:hello world', 
    '/home/user/folder/file2:1:world hello', 
    '/home/user/folder/folder/file3:1:bonjour=hello' 
]; 
var output = $('#output'); 

for(var i in lines) 
{ 
    var result = lines[i].match(regex).slice(1); 

    output.append(result.join(' - ') + "\n"); 
} 

Résultat:

 
/home/user/folder/file1 - 1 - hello world 
/home/user/folder/file2 - 1 - world hello 
/home/user/folder/folder/file3 - 1 - bonjour=hello 

fonctionne très bien pour moi, ce qui signifie probablement que je ne comprends pas votre question. J'espère que cela aide quand même. JSFiddle: http://jsfiddle.net/CVLk8/

Le slice(1) après la correspondance regex ci-dessus est de se débarrasser du premier résultat dans le tableau, qui correspond à la correspondance complète.

+0

pas mal mais il y a un problème quand je grep juste un fichier. Je peux tester si le deuxième élément du résultat est vide. '' ''1: bonjour world'''' donne' '' ["1", "", "bonjour monde"] '' 'voir ici: http://jsfiddle.net/CVLk8/2/ Pourquoi es-tu regex mieux? – Charles

+0

il a également échoué avec le chemin avec deux points comme ceci: '' '/ home/user/folder/fil: e1'''. Merci :) – Charles

+0

Je pense que vous devriez considérer les noms de fichiers avec des colons invalides - au moins pour votre propre santé mentale. Notez également que j'utilise un RegEx plus simple que le vôtre, en faisant simplement correspondre trois groupes qui ne contiennent pas ":" – Hubro

Questions connexes