0

This is an unexpected result I get

$ dpkg -l | grep linux-modules-nvidia-440-5.4.0-*
rc  linux-modules-nvidia-440-5.4.0-26-generic                   5.4.0-26.30+2                               amd64        Linux kernel nvidia modules for version 5.4.0-26
rc  linux-modules-nvidia-440-5.4.0-28-generic                   5.4.0-28.32                                 amd64        Linux kernel nvidia modules for version 5.4.0-28
...
$ dpkg -l | grep linux-modules-extra-5.4.0-*
rc  linux-modules-extra-5.4.0-26-generic                        5.4.0-26.30                                 amd64        Linux kernel extra modules for version 5.4.0 on 64 bit x86 SMP
rc  linux-modules-extra-5.4.0-28-generic                        5.4.0-28.32                                 amd64        Linux kernel extra modules for version 5.4.0 on 64 bit x86 SMP
...
$ dpkg -l | grep linux-modules-5.4.0-*
rc  linux-modules-5.4.0-26-generic                              5.4.0-26.30                                 amd64        Linux kernel extra modules for version 5.4.0 on 64 bit x86 SMP
rc  linux-modules-5.4.0-28-generic                              5.4.0-28.32                                 amd64        Linux kernel extra modules for version 5.4.0 on 64 bit x86 SMP
...
$ dpkg -l | grep linux-image-5.4.0-*
rc  linux-image-5.4.0-26-generic                                5.4.0-26.30                                 amd64        Signed kernel image generic
rc  linux-image-5.4.0-28-generic                                5.4.0-28.32                                 amd64        Signed kernel image generic
...
$ dpkg -l | grep linux-*-5.4.0-*
$ dpkg -l | grep linux-*-5.4*
$ dpkg -l | grep linux-*-5\.4*
$ dpkg -l | grep linux-*-5\\.4*
$ dpkg -l | grep "linux-*-5\.4*"
$ dpkg -l | grep "linux-*-5\\.4*"
$ dpkg -l | grep 'linux-*-5\\.4*'

As soon as I add * prior to ., grep stops matching. I would like to match any of the 4 cases (modules, etc.)

What is the correct regex so I can still match the results?

Among these, I would like to further filter *5.4.0-[2,3]*. But this is what I see as part of the output to $ dpkg -l | grep 5.4.0-[2,3]*

enter image description here

Why would lines with *5.4.0-4* match? The colorized part is what matches, which is 5.4.0- in this case, and I do not see how that matches the regex 5.4.0-[2,3]*. (I managed to remove those matches with $ dpkg -l | grep 5.4.0-[2,3][[:digit:]]*, but still I would like to understand why the unexpected matches here).

Or,

How can I combine matching wildcards, text, and multiple strings? e.g., something like linux- plus any of modules, image, modules-extra, modules-nvidia-440, plus -5.4.0-, plus [2,3], plus digit, plus *.

Note that this is not an XY problem. The motivation is that I want to use regex to quickly filter a set of package names to remove them all at once. But in this specific question I am asking why the usage of grep I tried did not work and what is the correct way of using it.

0 Answers0