У меня установлен GnuWin на машине Windows 7 Enterprise SP1 x64. Я пытаюсь использовать 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:]]*$'