为什么grep 需要使用'$' 在正则表达式中加一个点?

Dar*_*enW 4 grep regex

我虽然知道 grep,但也许不知道。

我想在以“:”结尾的文件中找到所有行,如果我运行

grep :$ ~/greptester.txt
Run Code Online (Sandbox Code Playgroud)

但令我惊讶的是,它没有给出任何结果。有时我会混淆 '^' 和 '$',不得不猜测哪个是开始,哪个是行尾,但我检查了一下,$ 确实是行尾。

折腾了好久,无意间发现跑步

grep :.$ ~/greptester.txt
Run Code Online (Sandbox Code Playgroud)

确实给出了预期的结果。为什么?

这是文本文件:

test line one
1 line with a colon:
ignore this line
3456 some stuff:
cat: meow; dog: bark; horse: four (4) legs.
goat, 7 elephants
Run Code Online (Sandbox Code Playgroud)

这在 Ubuntu 和带有 Cygwin 的 Windows 机器上都会发生。

Ken*_*ent 6

您的文件有\r\n(CR+LF) 行结尾(可能是在 Windows 中创建的?),而大多数 UNIX 文件仅以\n(LF)结尾。

因此,在 grep 看到\n后面的:字符之前\r,它必须与.通配符匹配。

  • @darenw 因为 `\r` 是一个真实的字符,有时你可能想要搜索它(它发生在我身上)。让 `grep` 任意决定 `\r` 在某种程度上是特别的是一个坏主意。它应该如何处理 `\t` 或任何其他转义字符? (4认同)
  • 现在是 2013 年,我们仍在处理行尾废话。人类,嘘!后续问题:为什么不让 grep 足够聪明以忽略这个细节? (2认同)