Skip to content

Commit 5632c5a

Browse files
committed
Fix pat. or regex starting with '-'
1 parent 33c3f69 commit 5632c5a

File tree

5 files changed

+54
-24
lines changed

5 files changed

+54
-24
lines changed

README.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ Please note that the data might look very differently when the files get so larg
173173

174174
### Future ideas
175175

176+
176177
- Test-run a with info outputted about what will happen (sets -t and does not change anything)
177178
- Let search and replace be withing the names of the files (ask for overwriting. -Y = no questions)
178179
- Let search and replace be within the path of the files (ask for overwriting. -Y = no questions)
@@ -188,7 +189,9 @@ Please note that the data might look very differently when the files get so larg
188189
- Flag for simple string search (all other chars than [\n\r\t])
189190
- Flag for plain string search litteral (no regex, no special chars, no escape chars)
190191
- Check if https://github.com/eugeneware/replacestream is good to rely on
191-
192+
- Check if regex engine from spidermonkey can be wrapped in someting thatdoes not need node
193+
- Implement in go, so all platforms can be supported with no need for node (might be based on)
194+
- let https://github.com/dthree/vorpal deal with the interface?
192195

193196

194197

bin/rexreplace.cli.js

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,28 @@
11
#!/usr/bin/env node
22
'use strict';
33

4-
var version = '2.0.4';
4+
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
5+
6+
var version = '2.1.0';
57
var fs = require('fs');
68
var path = require('path');
79
var font = require('chalk');
810
var globs = require('globs');
911

12+
var pattern = void 0,
13+
replacement = void 0;
14+
var helpAndDie = false;
15+
if (process.argv.length < 4) {
16+
helpAndDie = true;
17+
} else {
18+
var _process$argv$splice = process.argv.splice(2, 2);
19+
20+
var _process$argv$splice2 = _slicedToArray(_process$argv$splice, 2);
21+
22+
pattern = _process$argv$splice2[0];
23+
replacement = _process$argv$splice2[1];
24+
}
25+
1026
var yargs = require('yargs').strict().usage('RexReplace ' + version + ': Regexp search and replace for files using lookahead and backreference to matching groups in the replacement. Defaults to global multiline case-insensitive search.\n\n> rexreplace searchFor replaceWith filename').example("> rexreplace '(f?(o))o(.*)' '$3$1$2' myfile.md", "'foobar' in myfile.md will become 'barfoo'").example('').example("> rexreplace -I 'Foo' 'xxx' myfile.md", "'foobar' in myfile.md will remain 'foobar'").example('').example('> rexreplace \'^#\' \'##\' *.md', 'All markdown files in this dir got all headlines moved one level deeper').version('v', 'Echo rexreplace version', version).alias('v', 'version').boolean('I').describe('I', 'Void case insensitive search pattern.').alias('I', 'void-ignore-case').boolean('M').describe('M', 'Void multiline search pattern. Makes ^ and $ match start/end of whole content rather than each line.').alias('M', 'void-multiline').boolean('u').describe('u', 'Treat pattern as a sequence of unicode code points.').alias('u', 'unicode').describe('e', 'Encoding of files.').alias('e', 'encoding').default('e', 'utf8').boolean('o').describe('o', 'Output the result instead of saving to file. Will also output content even if no replacement have taken place.').alias('o', 'output')
1127
//.conflicts('o', 'd')
1228

@@ -60,13 +76,13 @@ var args = yargs.argv;
6076

6177
debug(args);
6278

63-
if (args._.length < 3) {
64-
die('Need more than 2 arguments', args._.length + ' was found', true);
79+
if (helpAndDie) {
80+
die('Need both pattern and replacement as arguments', true);
6581
}
6682

6783
if (!args['€']) {
68-
args._[0] = args._[0].replace('€', '$');
69-
args._[1] = args._[1].replace('€', '$');
84+
pattern = pattern.replace('€', '$');
85+
replacement = replacement.replace('€', '$');
7086
}
7187

7288
var flags = 'g';
@@ -83,16 +99,14 @@ if (args.unicode) {
8399
debug(flags);
84100

85101
// Get regex pattern
86-
var regex = args._.shift();
102+
103+
var regex = void 0;
87104
try {
88-
regex = new RegExp(regex, flags);
105+
regex = new RegExp(pattern, flags);
89106
} catch (err) {
90-
die('Wrong formatted regexp', regex);
107+
die('Wrong formatted regexp', err);
91108
}
92109

93-
// Get replacement
94-
var replace = args._.shift();
95-
96110
// The rest are files
97111
var files = globs.sync(args._);
98112

@@ -109,7 +123,7 @@ files
109123

110124
// Do the replacement
111125
.forEach(function (filepath) {
112-
return replaceInFile(filepath, regex, replace, args.encoding);
126+
return replaceInFile(filepath, regex, replacement, args.encoding);
113127
});
114128

115129
function replaceInFile(file, regex, replace, encoding) {

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "rexreplace",
3-
"version": "2.0.4",
3+
"version": "2.1.0",
44
"description": "Friendly CLI regexp search and replace in files.",
55
"author": "Mathias Rangel Wulff",
66
"license": "MIT",

src/rexreplace.cli.js

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,14 @@ const path = require('path');
66
const font = require('chalk');
77
const globs = require('globs');
88

9+
let pattern, replacement;
10+
let helpAndDie = false;
11+
if(process.argv.length<4){
12+
helpAndDie = true;
13+
} else {
14+
[pattern, replacement] = process.argv.splice(2,2);
15+
}
16+
917
let yargs = require('yargs')
1018
.strict()
1119

@@ -129,13 +137,13 @@ const args = yargs.argv;
129137

130138
debug(args);
131139

132-
if(args._.length<3){
133-
die('Need more than 2 arguments',args._.length+' was found',true);
140+
if(helpAndDie){
141+
die('Need both pattern and replacement as arguments',true);
134142
}
135143

136144
if(!args['€']){
137-
args._[0] = args._[0].replace('€','$');
138-
args._[1] = args._[1].replace('€','$');
145+
pattern = pattern.replace('€','$');
146+
replacement = replacement.replace('€','$');
139147
}
140148

141149
let flags = 'g';
@@ -152,15 +160,15 @@ if(args.unicode){
152160
debug(flags);
153161

154162
// Get regex pattern
155-
let regex = args._.shift();
163+
164+
let regex;
156165
try{
157-
regex = new RegExp(regex,flags);
166+
regex = new RegExp(pattern,flags);
158167
} catch (err){
159-
die('Wrong formatted regexp', regex);
168+
die('Wrong formatted regexp', err);
160169
}
161170

162-
// Get replacement
163-
const replace = args._.shift();
171+
164172

165173
// The rest are files
166174
const files = globs.sync(args._);
@@ -173,7 +181,7 @@ files
173181
.filter(filepath=>fs.existsSync(filepath)?true:error('File not found:',filepath))
174182

175183
// Do the replacement
176-
.forEach(filepath=>replaceInFile(filepath,regex,replace,args.encoding))
184+
.forEach(filepath=>replaceInFile(filepath,regex,replacement,args.encoding))
177185
;
178186

179187

test/test.sh

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ reset
3030
rexreplace o x myfile
3131
assert "cat myfile" "fxxbar"
3232

33+
# rr can handle a pattern and replcaement starting with '-'
34+
reset
35+
rexreplace '^(.+)$' '- $1' myfile
36+
rexreplace '- f' '_' myfile
37+
assert "cat myfile" "_oobar"
3338

3439
# -v
3540
reset

0 commit comments

Comments
 (0)