我在 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:]]*$'