为什么 grep 不能在这种模式下使用冒号?

why doesn't grep work in this pattern with colon?

我知道冒号 : 应该是文字,所以我不清楚为什么 grep 匹配所有行。这是一个名为 "test":

的文件
cat test
123|4444
4546|4444
666666|5678
7777777|7890675::1

我需要将行与 ::1 匹配。当然,实际情况比较复杂,不能简单的搜索“::1”。我尝试了很多迭代,比如

grep -E '^[0-9]|[0-9]:' test
grep -E '^[0-9]|[0-9]::1' test

但他们 return 所有行:

123|4444
4546|4444
666666|5678
7777777|7890675::1

我希望只匹配最后一行。知道这是为什么吗??

这是GNU/Linuxbash。谢谢!

管道需要转义并且你需要允许重复的数字:

grep -E '^[0-9]+\|[0-9]+:' test

否则,^[0-9]grep.

保留的行所需的全部匹配项

有两个问题:

  1. 正则表达式 [0-9] 匹配任何 单个 数字。由于您有多个数字,因此您需要将这些部分替换为 [0-9]+,它匹配一个 或更多 数字。如果要允许没有数字的空序列,请将 + 替换为 *,这意味着“零个或多个”。
  2. 竖线字符|表示正则表达式中的“替代”。您提供的内容将匹配 行首的数字, 后跟冒号的数字。由于每一行至少有一个,所以你匹配每一行。要获得文字 | 字符,您可以使用 [|]\|;大多数样式通常首选第二个选项。

应用这两个,你得到 ^[0-9]+\|[0-9]+::1

鉴于:

$ echo "$txt"
123|4444
4546|4444
666666|5678
7777777|7890675::1

使用重复(+表示'one or more')和字符classes:

$ echo "$txt" | grep -E '^[[:digit:]]+[|][[:digit:]]+[:]+'
7777777|7890675::1

因为 | 是正则表达式元字符,它必须被转义 (\|) 或在字符 class 中。

另一种方法是使用像 awk 这样的工具,它可以处理每行的 字段 ,并匹配 第二个字段 的行以“::1”

结尾
awk -F'|' ' ~ /::1$/' test