I have a text file with the following content:
Read the `lmn(7)` man page but not qrs(6).
* abc(1)
* `efg(3)`
* `ijk(1)`
* xyz(5)
I want now to filter for all lines that contain a man page name that is not in backticks? The expected output is:
Read the `lmn(7)` man page but not qrs(6).
* abc(1)
* xyz(5)
For demonstration purposes, I need this as a single grep command and not with other tools or piped.
I tried the following, but it only returns the first line:
$ egrep '[^`][a-z]*\([0-9]\)[^`]'
CodePudding user response:
It doesn't match the other lines because there's no character after the )
to match [^`]
. You need to add an alternative to match the end of the line. And you should have a similar alternative for the first backtick to match the beginning of the line.
grep -E '(^|[^`])[a-z]*\([0-9]\)([^`]|$)'
CodePudding user response:
This grep -v
should work for with the given examples:
grep -v '^\* `' file
Read the `lmn(7)` man page but not qrs(6).
* abc(1)
* xyz(5)
We are just filtering out lines that start with * `
using grep -v
.
CodePudding user response:
If these matches occur without a backtick between the match and the end of the string:
grep -E '[^`][a-z]*\([0-9]\)[^`]*$' file
Output
Read the `lmn(7)` man page but not qrs(6).
* abc(1)
* xyz(5)