74 lines
1.8 KiB
JavaScript
74 lines
1.8 KiB
JavaScript
var common = require('./common');
|
|
var fs = require('fs');
|
|
|
|
common.register('grep', _grep, {
|
|
globStart: 2, // don't glob-expand the regex
|
|
canReceivePipe: true,
|
|
cmdOptions: {
|
|
'v': 'inverse',
|
|
'l': 'nameOnly',
|
|
'i': 'ignoreCase',
|
|
},
|
|
});
|
|
|
|
//@
|
|
//@ ### grep([options,] regex_filter, file [, file ...])
|
|
//@ ### grep([options,] regex_filter, file_array)
|
|
//@
|
|
//@ Available options:
|
|
//@
|
|
//@ + `-v`: Invert `regex_filter` (only print non-matching lines).
|
|
//@ + `-l`: Print only filenames of matching files.
|
|
//@ + `-i`: Ignore case.
|
|
//@
|
|
//@ 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`.
|
|
function _grep(options, regex, files) {
|
|
// Check if this is coming from a pipe
|
|
var pipe = common.readFromPipe();
|
|
|
|
if (!files && !pipe) common.error('no paths given', 2);
|
|
|
|
files = [].slice.call(arguments, 2);
|
|
|
|
if (pipe) {
|
|
files.unshift('-');
|
|
}
|
|
|
|
var grep = [];
|
|
if (options.ignoreCase) {
|
|
regex = new RegExp(regex, 'i');
|
|
}
|
|
files.forEach(function (file) {
|
|
if (!fs.existsSync(file) && file !== '-') {
|
|
common.error('no such file or directory: ' + file, 2, { continue: true });
|
|
return;
|
|
}
|
|
|
|
var contents = file === '-' ? pipe : fs.readFileSync(file, 'utf8');
|
|
if (options.nameOnly) {
|
|
if (contents.match(regex)) {
|
|
grep.push(file);
|
|
}
|
|
} else {
|
|
var lines = contents.split('\n');
|
|
lines.forEach(function (line) {
|
|
var matched = line.match(regex);
|
|
if ((options.inverse && !matched) || (!options.inverse && matched)) {
|
|
grep.push(line);
|
|
}
|
|
});
|
|
}
|
|
});
|
|
|
|
return grep.join('\n') + '\n';
|
|
}
|
|
module.exports = _grep;
|