GnuWin grep 行尾锚点

GnuWin grep 行尾锚点

我在 Windows 7 Enterprise SP1 x64 计算机上安装了 GnuWin。我尝试使用 grep 2.5.3 来匹配包含单词“true”的行。以下是我的实际用例:

(echo true& echo true2) | grep 'true'

上面的代码匹配了两行。现在我想使用行尾锚点$(美元符号)排除第二行。我尝试了以下变体,但均未匹配任何一行:

(echo true& echo true2) | grep 'true$'
(echo true& echo true2) | grep 'true\$'
(echo true& echo true2) | grep 'true\\$'
(echo true& echo true2) | grep 'true\\\$'
(echo true& echo true2) | grep 'true\\\\$'
(echo true& echo true2) | grep 'true\\\\\$'
(echo true& echo true2) | grep 'true\\\\\\$'
(echo true& echo true2) | grep 'true^$'
(echo true& echo true2) | grep 'true^^$'
(echo true& echo true2) | grep 'true^^^$'
(echo true& echo true2) | grep 'true^^^^$'
(echo true& echo true2) | grep 'true^^^^^$'
(echo true& echo true2) | grep 'true^^^^^^$'
(echo true& echo true2) | grep 'true$$'
(echo true& echo true2) | grep 'true\^$'
(echo true& echo true2) | grep 'true^\$'
(echo true& echo true2) | grep 'true\\^$'
(echo true& echo true2) | grep 'true\^\$'
(echo true& echo true2) | grep 'true^\\$'
(echo true& echo true2) | grep 'true\^^$'
(echo true& echo true2) | grep 'true^\^$'
(echo true& echo true2) | grep 'true^^\$'
(echo true& echo true2) | grep 'true\\\^$'
(echo true& echo true2) | grep 'true\\^\$'
(echo true& echo true2) | grep 'true\^\\$'
(echo true& echo true2) | grep 'true^\\\$'
(echo true& echo true2) | grep 'true\\^^$'
(echo true& echo true2) | grep 'true\^\^$'
(echo true& echo true2) | grep 'true^\\^$'
(echo true& echo true2) | grep 'true\^^\$'
(echo true& echo true2) | grep 'true^\^\$'
(echo true& echo true2) | grep 'true^^\\$'
(echo true& echo true2) | grep 'true\^^^$'
(echo true& echo true2) | grep 'true^\^^$'
(echo true& echo true2) | grep 'true^^\^$'
(echo true& echo true2) | grep 'true^^^\$'

我还尝试了上述每个方法,使用双引号代替单引号,但同样不起作用。有人知道如何将正则表达式锚定到行尾,以便只有我示例中的第一行(“true”)匹配吗?谢谢。

答案1

Cygwin:(echo true; echo true2) | grep true$

GnuWin:(echo true & echo true2) | grep "true $"

在cmd中,(echo true & echo true2)实际上给出了true \r\ntrue2\r\n

答案2

事实证明这是多个问题的组合。 (echo true & echo true2)(我从问题中删除了该错误,因为它与我真正想知道的内容无关)实际上在 Windows 机器上输出以下内容:

true \r\n
true2\r\n

因此,第一个问题是我的 echo 命令包含了一个多余的空格字符。第二个问题是,grep将其\n视为行尾,这在以下问题的答案中有所解释:为什么行尾 $ 锚点不能与 grep 命令一起使用? 因此第二个问题是我需要\r在正则表达式中捕获字符。因此,下面是实现此功能所需的操作:

(echo true& echo true2) | grep 'true[[:space:]]*$'

相关内容