grep for entries that do not contain a backtick before and after a regexp

Viewed 34

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]\)[^`]'
3 Answers

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]\)([^`]|$)'

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.

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)
Related