Useful Grep Replacement For Mac
Say I have a file: # file: 'test.txt' foobar bash 1 bash foobar happy foobar I only want to know what words appear after 'foobar', so I can use this regex: 'foobar ( w + )' The parenthesis indicate that I have a special interest in the word right after foobar. But when I do a grep 'foobar ( w + )' test.txt, I get the entire lines that match the entire regex, rather than just 'the word after foobar': foobar bash 1 foobar happy I would much prefer that the output of that command looked like this: bash happy Is there a way to tell grep to only output the items that match the grouping (or a specific grouping) in a regular expression? GNU grep has the -P option for perl-style regexes, and the -o option to print only what matches the pattern.
These can be combined using look-around assertions (described under ) to remove part of the grep pattern from what is determined to have matched for the purposes of -o. $ grep -oP 'foobar K w+' test.txt bash happy $ The K is the short-form (and more efficient form) of (?
I'm doing a regular expression, which works fine in RegExRx or any other RegEx tool I've tested, but when I try to do a GREP using that RegEx, it finds no files. This RegEx finds all the files with a space on either side of the equals. Grep -Ri accesslevel = 3 dirname - But this RegEx, trying to account for possibly no or more than one space around the equals, finds nothing. Grep -Ri accesslevel s.= s.3 dirname And, this similarly finds nothing: grep -Ri accesslevel?.=?.3 dirname What am I doing wrong? Thanks in advance, - M. Code: grep -Ri 'accesslevel = 3' dirname grep -Ri 'accesslevel s.= s.3' dirname grep -Ri 'accesslevel?.=?.3' dirname. My second guess is that grep doesn't recognize ' s'.
Grep Examples
You should read its man page to make sure, as this might vary depending on OS version (or post 'grep -version'). Also look at the 'egrep' command, and/or the -E option to grep. For the grep I have here, it DOES NOT recognize ' s' as a meta pattern, which means it's treated as a simple 's' character. The '.'
means 'zero or more times' for whatever the prior expression is. So on my machine, that would be 'zero ore more S's'. This would NOT match any space characters, because space isn't an 's' or 'S'. The third command (with?' S) is unlikely to produce what you want. If you expect '?'
To mean 'any character', then that's not how grep works. Grep's 'any character' meta-character is '.' Conversely, the shell's pattern expansion DOES treat? As 'any single character'. Unfortunately, the. Grep has named classes for a variety of character classes.
Grep For A File
The name for whitespace is ':space:'. Since this name is only recognized between 's, the pattern is ':space:'. So the sub-pattern that means 'zero or more whitespace' is. Code: grep -Ri 'accesslevel = 3' dirname grep -Ri 'accesslevel s.= s.3' dirname grep -Ri 'accesslevel?.=?.3' dirname. My second guess is that grep doesn't recognize ' s'. You should read its man page to make sure, as this might vary depending on OS version (or post 'grep -version').
Mac Os Grep Examples
Also look at the 'egrep' command, and/or the -E option to grep. For the grep I have here, it DOES NOT recognize ' s' as a meta pattern, which means it's treated as a simple 's' character. The '.' means 'zero or more times' for whatever the prior expression is. So on my machine, that would be 'zero ore more S's'. This would NOT match any space characters, because space isn't an 's' or 'S'. The third command (with?'
S) is unlikely to produce what you want. If you expect '?'
To mean 'any character', then that's not how grep works. Grep's 'any character' meta-character is '.'
Conversely, the shell's pattern expansion DOES treat? As 'any single character'. Unfortunately, the. Grep has named classes for a variety of character classes. The name for whitespace is ':space:'. Since this name is only recognized between 's, the pattern is ':space:'.
So the sub-pattern that means 'zero or more whitespace' is. Click to expand.First of all thank you for your excellent posting! Unfortunately, not a single one of your suggestions worked and produced the same number of hits as simply saying: grep -Ri accesslevel = 3 dirname I'm stumped. Unfortunately, there isn't AFAIK, a single search program for the Mac which supports Regular Expressions. Most, if not all of them, with a couple minor exceptions, lazily rely on the spotlight index which won't help me at all since these files are not known by Spotlight and will never have a SL extension. Thanks very much.