为什么 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
.
保留的行所需的全部匹配项
有两个问题:
- 正则表达式
[0-9]
匹配任何 单个 数字。由于您有多个数字,因此您需要将这些部分替换为 [0-9]+
,它匹配一个 或更多 数字。如果要允许没有数字的空序列,请将 +
替换为 *
,这意味着“零个或多个”。
- 竖线字符
|
表示正则表达式中的“替代”。您提供的内容将匹配 行首的数字, 或 后跟冒号的数字。由于每一行至少有一个,所以你匹配每一行。要获得文字 |
字符,您可以使用 [|]
或 \|
;大多数样式通常首选第二个选项。
应用这两个,你得到 ^[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
我知道冒号 : 应该是文字,所以我不清楚为什么 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
.
有两个问题:
- 正则表达式
[0-9]
匹配任何 单个 数字。由于您有多个数字,因此您需要将这些部分替换为[0-9]+
,它匹配一个 或更多 数字。如果要允许没有数字的空序列,请将+
替换为*
,这意味着“零个或多个”。 - 竖线字符
|
表示正则表达式中的“替代”。您提供的内容将匹配 行首的数字, 或 后跟冒号的数字。由于每一行至少有一个,所以你匹配每一行。要获得文字|
字符,您可以使用[|]
或\|
;大多数样式通常首选第二个选项。
应用这两个,你得到 ^[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