У меня установлен 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")? Благодарю.

2 ответа2

2

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

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

В cmd (echo true & echo true2) фактически дает true \r\ntrue2\r\n

0

Это оказалось сочетанием проблем. (echo true & echo true2) (я отредактировал эту ошибку из своего вопроса, поскольку она не имела отношения к тому, что я действительно хотел знать), на самом деле выводит следующее на машине Windows:

true \r\n
true2\r\n

Итак, первая проблема заключается в том, что мои эхо-команды содержали посторонний космический символ. Вторая проблема заключается в том, что grep рассматривает \n как конец строки, что объясняется в ответе на вопрос:почему $ anchor в конце строки не работает с командой grep? Вторая проблема заключается в том, что мне нужно зафиксировать символ \r в моем регулярном выражении. Следовательно, вот что нужно, чтобы это заработало:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .