如何 grep 以 - 分隔的选定字符串

如何 grep 以 - 分隔的选定字符串

我是 grep 新手,我有一个包列表,我只需要显示某些结果。

以下是软件包列表:

apache2/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed]
apache2-bin/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed,automatic]
apache2-data/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 all [installed,automatic]
apache2-dbg/oldoldstable,oldoldstable 2.4.25-3+deb9u12 amd64
apache2-dev/oldoldstable,oldoldstable 2.4.25-3+deb9u12 amd64
apache2-doc/oldoldstable,oldoldstable 2.4.25-3+deb9u12 all
apache2-ssl-dev/oldoldstable,oldoldstable 2.4.25-3+deb9u12 amd64
apache2-suexec-custom/oldoldstable,oldoldstable 2.4.25-3+deb9u12 amd64
apache2-suexec-pristine/oldoldstable,oldoldstable 2.4.25-3+deb9u12 amd64
apache2-utils/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed,automatic]

我一直在尝试使用正则表达式,但我确信有问题:

cat list | grep 'apache2-(bin|data|utils)'

这是我的预期输出:

apache2/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed]
apache2-bin/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed,automatic]
apache2-data/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 all [installed,automatic]
apache2-utils/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed,automatic]

我的命令有什么问题/缺少什么?

答案1

使用 BRE(基本正则表达式)模式匹配时需要转义括号和|字符,这是默认的grep, 所以:

grep '^apache2-\?\(bin\|data\|utils\|\)/'

或者启用 ERE(扩展正则表达式)模式与-E开关匹配:

grep -E '^apache2-?(bin|data|utils|)/'

笔记:

  • 您不需要 feed grepwith,cat因为它像许多其他工具一样直接从文件中读取。
  • 我添加了行首^以从行首开始匹配。
  • -?在 ERE 和-\?BRE 中添加了仅匹配连字符-零次或一次的内容;另请注意,使用的\?标准 BRE 无效(尽管它至少可以在 GNU 或其他一些工具中工作)。 BRE\?相当于\{0,1\}.
  • |在其中添加了一个空的最后一个匹配(...|...|...|),它将匹配诸如apache2仅包含行之类的情况(但如果您的输入中有任何内容,它也会匹配,apache2-如果您不想匹配它,请grep -E '^apache2(-(bin|data|utils)|)/'改为使用);
  • 使用的\|也不是标准的 BRE,并且没有与之等效的东西。最好只使用 ERE 给出的替代方案。

也可以看看为什么我的正则表达式在 X 中有效但在 Y 中无效?

答案2

尝试这个: grep -Ex 'apache2(-(bin|data|utils))?' list

输出:

apache2
apache2-bin
apache2-data
apache2-utils

哎呀,问题改变了:)。

grep -E 'apache2(|/|(-(bin|data|utils)))?([^-]|$)' list

输出:

apache2/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed]
apache2-bin/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed,automatic]
apache2-data/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 all [installed,automatic]
apache2-utils/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed,automatic]

那么就不需要-x(完全匹配)了。

您可以使用egrep 代替-E 开关。 egrep 'apache2(|/|(-(bin|data|utils)))?([^-]|$)' list

相关内容