1

ブラウザで grep コマンドの結果を解析したい。結果grep -nriI "hello" myFolder は複数行の文字列です:

/home/user/folder/file1:1:こんにちは世界
/home/user/folder/file2:1:world hello
/home/user/folder/folder/file3:1:bonjour=こんにちは

まず、行を分割して配列を作成します。そして、この正規表現でそれを解析します:/^(.*?)\:(\d*)\:(.*?)$/

いくつか問題があります。

  1. ダブルポイント (:) のような変な文字を含む結果に対して解析が機能しません。
  2. ファイルをgrepすると、取得できませんpah:line number:contentline 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 に答える