为什么grep不用这种模式用冒号工作?

时间:2017-09-06 22:04:54

标签: regex linux bash grep 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

但他们会返回所有行:

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

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

这是GNU / Linux bash。谢谢!

4 个答案:

答案 0 :(得分:4)

管道需要转义,您需要允许重复数字:

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

否则^[0-9]只需要匹配grep要保留的行。

答案 1 :(得分:2)

假设:

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

使用重复(+表示'一个或多个')和字符类:

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

由于|是正则表达式元字符,因此必须对其进行转义(\|)或字符类。

答案 2 :(得分:1)

有两个问题:

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

答案 3 :(得分:0)

另一种方法是使用像awk这样的工具来处理每一行的字段,并匹配第二字段结束的行" :: 1"

awk -F'|' '$2 ~ /::1$/' test