grep 不匹配确切的字符串

grep not matching exact string

我对 grep 没有按预期表现感到有点困扰。 我正在尝试从一种字典中提取主机,其结构类似于 OLD_HOST_NAME;NEW_HOST_NAME,其中一些具有相同的前缀,例如“HOST-1-2”。 我只想匹配“HOST-1-2”,但独立于我传递给 grep 的选项,它会返回所有具有相同前缀的字符串,而不是只匹配确切的字符串,即:

grep -F "HOST-1-2" dict.txt
HOST-1-2-3;NEW_HOST-1-2-3
HOST-1-2-4;NEW_HOST-1-2-4
HOST-1-2-5;NEW_HOST-1-2-5

我尝试了几个选项,例如 grep -w "HOST-1-2"grep -e '\HOST-1-2\b'grep -e '\HOST-1-2\b'grep -Po "\bHOST-1-2\b"(实际上符合我的要求,但它对所有出现的子字符串,所以它仍然无法正常工作),尝试混合它们,但在一天结束时我仍然没有得到我需要的东西。

知道如何实现我想要的结果,以便在没有所有其他部分匹配的情况下只搜索“HOST-1-2”吗?

编辑: 很抱歉没有更清楚地指定,字典示例是我已经显示的由于错误的子字符串匹配 crep:

old_host;new_host
SERVER-1;NEW_SERVER-1
HOST-1-2-3;NEW_HOST-1-2-3
HOST-1-2-4;NEW_HOST-1-2-4
HOST-1-2-5;NEW_HOST-1-2-5

我已经说明了我想要实现的目标:

in order for grepping only "HOST-1-2" without all the other partial matches

您可以使用这个 grep:

grep -E '(^|;)HOST-1-2(;|$)' file

这意味着:

  • -E: 启用扩展正则表达式模式
  • (^|;):比赛开始或;
  • HOST-1-2:匹配HOST-1-2
  • (;|$):匹配;或结束

您可以使用 grep -o 仅打印匹配的部分行,并在 2 之后和 H

之前添加一个单词边界
grep -o '\<HOST-1-2\>' ./dict.txt

输出

HOST-1-2
HOST-1-2
HOST-1-2

如果您只想打印第一个匹配项:

grep -oP '^.*?\b\KHOST-1-2\b' ./dict.txt