2012-06-04 2 views
1

Я хочу проанализировать результат команды grep в браузере. Нечто подобное grep -nriI "hello" myFolder Результат многострочный строка:разобрать результат grep в браузере с javascript

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

Сначала я разделить линии, чтобы иметь массив. И проанализируйте его с помощью этого регулярного выражения: /^(.*?)\:(\d*)\:(.*?)$/

У меня есть некоторые проблемы.

  1. Анализировать не будет работать на результат с забавным полукоксом как двойная точка (:)
  2. Когда я Grep файл, я не получаю pah:line number:content но только line number:content так сделать регулярное выражение более сложным (не названо группа в javascript regex).

У кого-то уже есть хороший парсер или проект, который его анализирует. Он должен работать в браузере ...

Я сделаю jsfiddle.

ответ

3

У моего grep (на Ubuntu Linux) есть несколько вариантов, которые могли бы помочь, хотя ни один из них не является стандартом POSIX.

неоднозначного вывода:

-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. 

Для отсутствующего файла:

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

Так использовать grep -nriIHZ и обновить регулярное выражение-то вроде этого (непроверенные):

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

grep выполняется на сервере, могу ли я передать \ 0 клиенту? Я пытаюсь это сделать, и в настоящее время \ 0 не появляется в ответе сервера. – Charles

+0

Это должно быть возможно. Не все зрители правильно отображают нулевые байты. Попробуйте запустить его через шестнадцатеричный просмотрщик, чтобы убедиться, что вы видите результат правильно. – Thomas

+0

Да, это работает :), как вы сказали '' 'grep -nriIHZ''' с' ''/^ (. *) \ 0 (\ d +): (. *) $/'' 'Perfect. Сетевая консоль хром не отображает ее, но присутствует символ ASCII NULL. – Charles

1

Код:

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"); 
} 

Результат:

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

прекрасно работает для меня, что, вероятно, означает, что я не понял ваш вопрос. Надеюсь, это все равно поможет. JSFiddle: http://jsfiddle.net/CVLk8/

slice(1) после того, как указанное совпадение регулярных выражений должно избавиться от первого результата в массиве, который является полным совпадением.

+0

не плохо но есть проблема, когда я grep просто файл. Я могу проверить, является ли второй элемент в результате пустым. '' ''1: hello world''' дает' '' ["1", "", "hello world"] '' 'здесь: http://jsfiddle.net/CVLk8/2/ Почему вы regex лучше? – Charles

+0

он также не прошел с помощью пути с двоеточием: '' '/ home/user/folder/fil: e1'''. Спасибо :) – Charles

+0

Я думаю, вы должны рассматривать имена файлов с двоеточиями недействительными - по крайней мере, для вашего собственного здравомыслия. Также обратите внимание, что я использую более простой RegEx, чем ваш, просто сопоставляя три группы, которые не содержат «:» – Hubro

Смежные вопросы