我知道冒号:应该是字面的,所以我不清楚为什么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。谢谢!
答案 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)
有两个问题:
state[parentIndex + i + 1] = temp;
匹配任何单个数字。由于您有多个数字,因此需要使用[0-9]
替换这些部分,这些部分匹配一个或更多数字。如果您想允许没有数字的空序列,请将[0-9]+
替换为+
,这意味着“零或更多”。*
在正则表达式中表示“替代”。您提供的内容将匹配 行开头的数字,或数字后跟冒号。由于每一行至少有一行,所以你匹配每一行。要获得文字|
字符,您可以使用|
或[|]
;在大多数样式中,第二种选择通常是首选。同时应用这两项内容,即可获得\|
。
答案 3 :(得分:0)
另一种方法是使用像awk这样的工具来处理每一行的字段,并匹配第二字段结束的行" :: 1"
awk -F'|' '$2 ~ /::1$/' test