SparkMe Asked: 2023-01-28 09:18:00 +0800 CST2023-01-28 09:18:00 +0800 CST 2023-01-28 09:18:00 +0800 CST 为什么 grep with regex 命令不能在 Ubuntu 上运行 772 我想知道安装的软件包并以 mos 开头,然后下面的命令不起作用。 dpkg -l | grep ^mos* grep 2 个回答 Voted Best Answer steeldriver 2023-01-28T11:43:03+08:002023-01-28T11:43:03+08:00 虽然^mos*是一个完美的 cromulent grep 基本正则表达式 (BRE),但它可能并不像您认为的那样。您还应该养成引用传递给 grep 的任何模式的习惯,这样 shell 就不会尝试将其扩展为当前目录中的文件名列表。1个 *在正则表达式中是量词而不是通配符,因此mos*表示m o零个或多个s字符。shell 通配符的正则表达式等效项*是.*(任何字符,零次或多次)。然而,由于默认情况下 grep 输出整行,即使匹配是部分的,尾随.*是多余的 -^mos会做^mos.* 但是^将正则表达式锚定到行的开头- 并dpkg -l在其名称之前输出包的状态,因此^mos在这种情况下永远不会匹配。 您可以使用^.. *mos匹配锚定到行首的两个任意状态字符,后跟一个或多个空格mos: $ dpkg -l | grep '^.. *mos' ii most 5.0.0a-4 amd64 Pager program similar to more and less 但是我建议使用 awk 而不是 grep 来完成这项任务,因为您可以匹配特定字段ex。 $ dpkg -l | awk '$2 ~ /^mos/' ii most 5.0.0a-4 amd64 Pager program similar to more and less 或者如果您只想输出匹配的已安装包 dpkg -l | awk '$1 == "ii" && $2 ~ /^mos/' 或者至少停止依赖 shell 在模式不匹配时将模式的文字值传递给 grep - 尽管 bash 默认情况下这样做,但其他 shell(尤其是 zsh)不这样做。 Pilot6 2023-01-28T09:24:04+08:002023-01-28T09:24:04+08:00 要以这种方式grep使用正则表达式添加-E开关: dpkg -l | grep -E '^mos.*' 但这不会给您任何结果,因为dpkg -l行以ii和其他字符开头。 你可以试试这个: apt list --installed | grep -E '^mos.*'
虽然
^mos*
是一个完美的 cromulent grep 基本正则表达式 (BRE),但它可能并不像您认为的那样。您还应该养成引用传递给 grep 的任何模式的习惯,这样 shell 就不会尝试将其扩展为当前目录中的文件名列表。1个*
在正则表达式中是量词而不是通配符,因此mos*
表示m
o
零个或多个s
字符。shell 通配符的正则表达式等效项*
是.*
(任何字符,零次或多次)。然而,由于默认情况下 grep 输出整行,即使匹配是部分的,尾随.*
是多余的 -^mos
会做^mos.*
但是
^
将正则表达式锚定到行的开头- 并dpkg -l
在其名称之前输出包的状态,因此^mos
在这种情况下永远不会匹配。您可以使用
^.. *mos
匹配锚定到行首的两个任意状态字符,后跟一个或多个空格mos
:但是我建议使用 awk 而不是 grep 来完成这项任务,因为您可以匹配特定字段ex。
或者如果您只想输出匹配的已安装包
要以这种方式
grep
使用正则表达式添加-E
开关:但这不会给您任何结果,因为
dpkg -l
行以ii
和其他字符开头。你可以试试这个: