var common = require('./common'); | |
var fs = require('fs'); | |
//@ | |
//@ ### grep([options ,] regex_filter, file [, file ...]) | |
//@ ### grep([options ,] regex_filter, file_array) | |
//@ Available options: | |
//@ | |
//@ + `-v`: Inverse the sense of the regex and print the lines not matching the criteria. | |
//@ | |
//@ Examples: | |
//@ | |
//@ ```javascript | |
//@ grep('-v', 'GLOBAL_VARIABLE', '*.js'); | |
//@ grep('GLOBAL_VARIABLE', '*.js'); | |
//@ ``` | |
//@ | |
//@ Reads input string from given files and returns a string containing all lines of the | |
//@ file that match the given `regex_filter`. Wildcard `*` accepted. | |
function _grep(options, regex, files) { | |
options = common.parseOptions(options, { | |
'v': 'inverse' | |
}); | |
if (!files) | |
common.error('no paths given'); | |
if (typeof files === 'string') | |
files = [].slice.call(arguments, 2); | |
// if it's array leave it as it is | |
files = common.expand(files); | |
var grep = ''; | |
files.forEach(function(file) { | |
if (!fs.existsSync(file)) { | |
common.error('no such file or directory: ' + file, true); | |
return; | |
} | |
var contents = fs.readFileSync(file, 'utf8'), | |
lines = contents.split(/\r*\n/); | |
lines.forEach(function(line) { | |
var matched = line.match(regex); | |
if ((options.inverse && !matched) || (!options.inverse && matched)) | |
grep += line + '\n'; | |
}); | |
}); | |
return common.ShellString(grep); | |
} | |
module.exports = _grep; |