1

我想在浏览器中解析 grep 命令的结果。类似grep -nriI "hello" myFolder 结果是一个多行字符串:

/home/user/folder/file1:1:你好世界
/home/user/folder/file2:1:world 你好
/home/user/folder/folder/file3:1:bonjour=hello

首先,我将行拆分为一个数组。并用这个正则表达式解析它:/^(.*?)\:(\d*)\:(.*?)$/

我有一些问题。

  1. Parse 不适用于带有双点 (:) 等有趣字符的结果
  2. 当我 grep 文件时,我没有得到pah:line number:content,但line number:content它使正则表达式更加复杂(javascript 正则表达式中没有命名组)。

有人已经是一个很好的解析器或解析它的项目。它必须在浏览器中工作......

我会做一个jsfiddle。

4

2 回答 2

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+):(.*)$/
于 2012-06-04T11:50:52.330 回答
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 - 你好世界
/home/user/folder/file2 - 1 - 世界你好
/home/user/folder/folder/file3 - 1 - bonjour=hello

对我来说效果很好,这可能意味着我不明白你的问题。希望这无论如何都会有所帮助。JSFiddle:http: //jsfiddle.net/CVLk8/

上面的slice(1)正则匹配之后就是去掉数组中的第一个结果,也就是全匹配。

于 2012-06-04T11:50:52.003 回答