【发布时间】:2021-06-29 11:14:37
【问题描述】:
我有一个如下所示的文件:
5.3.236.113681.2225191122.986.3705653211.104 4
5.3.236.113681.2225191122.986.3705653211.104.3402 45
5.3.236.0.1.20549687.20.93.9.2.234266672113.4455 2
5.3.236.113681.5829104.986.3705653211.119 8
5.3.236.2.01107.50.01.24.48685.30000018053113560818700000112 172
基本的 grep 将显示这些结果;它显示了一个我不想要的附加匹配项。
$ grep 5.3.236.113681.2225191122.986.3705653211.104 test.txt
5.3.236.113681.2225191122.986.3705653211.104 4
5.3.236.113681.2225191122.986.3705653211.104.3402 45
我尝试 greping 寻找“固定字符串”;它显示了一个我不想要的附加匹配项。
$ grep -F 5.3.236.113681.2225191122.986.3705653211.104 test.txt
5.3.236.113681.2225191122.986.3705653211.104 4
5.3.236.113681.2225191122.986.3705653211.104.3402 45
我尝试 greping 只是为了匹配;它显示了一个我不想要的附加匹配项。
$ grep -w 5.3.236.113681.2225191122.986.3705653211.104 test.txt
5.3.236.113681.2225191122.986.3705653211.104 4
5.3.236.113681.2225191122.986.3705653211.104.3402 45
这行得通,但从技术上讲,它似乎是在寻找我想要的字符串加上空格,这似乎更像是一种解决方法,而不是专门针对我想要的东西。
$ grep "5.3.236.113681.2225191122.986.3705653211.104[[:space:]]" test.txt
5.3.236.113681.2225191122.986.3705653211.104 4
有效的问题是所需的字符串末尾可能没有空格,它可能在前面有空格,如下所示:
4 5.3.236.113681.2225191122.986.3705653211.104
45 5.3.236.113681.2225191122.986.3705653211.104.3402
以前有效的命令在格式稍有不同的列表上无效。
我可以简单地写grep "[[:space:]]5.3.236.113681.2225191122.986.3705653211.104,但我不想为每个这样的小差异重新编写 grep。
我希望能够对该字符串进行 grep 并显示整行,而不管该行在文本中的显示方式或位置。
【问题讨论】:
-
[.]是一个仅包含.的字符类,也就是说,在我看来,您的问题并不完全是特定于时期的——您担心的是最后,不是.是一个单字符通配符。那么,为什么标题要谈论句号呢? -
在开头搜索
([[:space:]]|^)并在结尾搜索([[:space:]]|$)并没有什么不寻常的习惯。你遇到的更大的问题是你根本没有问过的问题——1.2.3也匹配10243,因为.是一个通配符。 -
顺便说一句,这不应该被标记为
bash-- grep 不是 bash 的一部分,它是一个外部命令,可以从任何 shell 或根本没有 shell 使用。 -
@CharlesDuffy 我不知道标题是怎么变成这样的,这不是我最初使用的标题。已编辑。我去删除 bash 标签,但它已经消失了。抱歉,不知道。
-
明确地说,我反对的标题是 original 一个,grep 表示字符串中包含句点的变量。到我发表评论时,我已经将其修复为更清晰的内容。同样,我自己修复了 bash 标记,并且仅在评论中描述 为什么 进行了更改。