Highlight Perl regular expression patterns with multiple colors
This was initially from hhighlighter, but I decided to implement the low level pattern parsing and highlighting, which are handled by ack/ack-grep in hhighlighter. This is because I found issues when using hhighlighter in some test cases - For example:
-
echo "tastb'c" | h "b\'c"will reach the following error:bash: eval: line 145: unexpected EOF while looking for matching `''
bash: eval: line 146: syntax error: unexpected end of file
-
echo "abbcccdddd" | h 'b?'won't come back to shell until Ctrl+C. -
echo "abcdefgababcde" | h '(ab){2,5}'will highlight only the last "ab", not "abab".
By using mch, all these problems go away, just like how grep -P does in pattern matching - Besides, mch supports different colors for different patterns. That's it.
Doing the following should NOT spoil your existing environment - You will only get a new command h in the form of Bash function.
In ~/.bashrc, source the script h. And the command h will be ready for use.
The text that has patterns to be highlighted HAS TO be piped into the command h. It may have the following use cases:
- Used by other scripts, like cxpgrep, in output processing.
- Highlight patterns in a text file in different colors:
cat FILE | h PAT1 PAT2 ... | less -RIt supports only 1 option -i that means case insensitive matching.
I designed a bunch of test cases to verify the implementation of pattern parsing and highlighting. Cases can be added to the file cases_h. And there are 2 ways to use the cases: automated and interactive.
Automated:
source ch_tests_automated.sh cases_hInteractive:
source ch_tests_interactive.sh cases_hIn both methods, one needs to compare the output of h and grep -P. Certainly grep doesn't support multi-color highlighting.
Also, note that these 2 scripts are NOT to be run directly. They need to be sourced into the current shell environment. See above.
- 1.0
- First working code
- 1.1
- README and source code header comment updates
This software (mch) is distributed under the MIT license.