grep -P no longer works. How can I rewrite my searches?
Install ack and use it instead. Ack is a grep replacement written in Perl. It has full support for Perl regular expressions.
If your scripts are for your use only, you can install grep
from homebrew-core
using brew
:
brew install grep
Then it's available as ggrep
(GNU grep
).
it doesn't replaces the system grep
(you need to put the installed grep before the system one on the PATH
).
The version installed by brew
includes the -P
option, so you don't need to change your scripts.
If you need to use these commands with their normal names, you can add a "gnubin" directory to your PATH from your bashrc like:
PATH="/usr/local/opt/grep/libexec/gnubin:$PATH"
You can export this line on your ~/.bashrc or ~/.zshrc to keep it for new sessions.
Please see here for a discussion of the pro-s and cons of the old --with-default-names
option and it's (recent) removal.
OS X tends to provide BSD rather than GNU tools. It does come with egrep
however, which is probably all you need to perform regex searches.
example: egrep 'fo+b?r' foobarbaz.txt
A snippet from the OSX grep man page:
grep is used for simple patterns and basic regular expressions (BREs); egrep can handle extended regular expressions (EREs).
If you want to do the minimal amount of work, change
grep -P 'PATTERN' file.txt
to
perl -nle'print if m{PATTERN}' file.txt
and change
grep -o -P 'PATTERN' file.txt
to
perl -nle'print $& while m{PATTERN}g' file.txt
So you get:
var1=`perl -nle'print $& while m{(?<=<st:italic>).*(?=</italic>)}g' file.txt`
var2=`perl -nle'print $& while m{(property:)\K.*\d+(?=end)}g' file.txt`
In your specific case, you can achieve simpler code with extra work.
var1=`perl -nle'print for m{<st:italic>(.*)</italic>}g' file.txt`
var2=`perl -nle'print for /property:(.*\d+)end/g' file.txt`