在 bash 中搜索时如何排除某些模式

how to exclude certain pattern when searching in bash

假设我有

 abc-def1-xxx
 abc-def2-yy-vv
 abc-def3
 abc-def4

我要输出abc-def3abc-def4

如果我使用模式 abc-def* 那么它会输出所有内容。 如果我搜索 abc-def*-* 那么它会输出前两个条目 我如何获得最后两个条目?

假设将数据放入文件中,data.txt

abc-def1-xxx
abc-def2-yy-vv
abc-def3
abc-def4

获取最后两行的命令是:

grep -E '*[0-9]$' data.txt

解释:

  • -E,模式被解释为扩展的正则表达式。
  • *:任意字符
  • [0-9]: 一位数
  • $:以$之前的字符结束。所以在这里,表示字符串必须以数字结尾。

所以它查看 data.txt 中的行,并输出最后一个字符是数字的行,从 0 到 9。

您可以使模式更具体,匹配带有连字符的小写字符并在末尾匹配 1 个或多个数字

  • ^ 字符串开头
  • [a-z]\+ 匹配 1+ 个字符 a-z
  • -字面匹配
  • [a-z]\+ 匹配 1+ 个字符 a-z
  • [0-9]\+ 匹配 1+ 个数字
  • $ 字符串结束

例如

echo "abc-def1-xxx
abc-def2-yy-vv
abc-def3
abc-def4" | grep '^[a-z]\+-[a-z]\+[0-9]\+$'

输出

abc-def3
abc-def4

您还可以匹配 abc-def,然后匹配 1 个或多个数字:

^abc-def[0-9]\+$