我对 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
我已经说明了我想要实现的目标:
<块引用>为了只对“HOST-1-2”进行 grepping 而没有所有其他部分 匹配
答案 0 :(得分:1)
您可以使用此grep
:
grep -E '(^|;)HOST-1-2(;|$)' file
这意味着:
-E
:启用扩展正则表达式模式(^|;)
:匹配开始或;
HOST-1-2
:匹配HOST-1-2
(;|$)
:匹配 ;
或结束答案 1 :(得分:1)
您可以使用 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