Перейти к содержимому

GnuWin grep Конец линии Якорь

0

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

168 просмотров
Jeff G спросил 10 лет назад
J 168

2 ответа

2

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

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

In cmd, (echo true & echo true2) actually gives true \r\ntrue2\r\n

Ах, хороший улов с проблемой пробелов. Тем не менее, ваш подход GnuWin все еще не работает для меня. Возможно, я что-то пропустил: (echo true & echo true2) | grep "true $" все еще ничего не соответствует.

Jeff G · 10 лет назад · 0

@Jeff: облом ... что насчет | grep -P "true \ s +" ?

guest-vm · 10 лет назад · 1

Да, это сделало это для меня. Это то, что grep не включает \ r в класс символов \ s, а Perl?

Jeff G · 10 лет назад · 0

К сожалению, grep не поддерживает несколько шаблонов с опцией -P. В моем случае я должен решить, объединить ли все мои регулярные выражения в одно действительно длинное или использовать грязный взлом [[: cntrl:]], который я нашел в другом месте.

Jeff G · 10 лет назад · 0

@ Джефф, что ты имеешь в виду под множеством шаблонов? хотите привести пример?

guest-vm · 10 лет назад · 0

Поздний ответ: Perl \ s =[\ t \ v \ n \ f \ r]= grep[[: space:]]. AFAIK, класс символов обратной косой черты не распознается grep.

guest-vm · 10 лет назад · 1

Под множественными шаблонами я имею в виду, что я называю это как grep -e" Pattern1 "-e" Pattern2 "... -e" PatternN ", где мои шаблоны невероятно нетривиальны (в основном из-за сложности побега из пакета). последовательности).

Jeff G · 10 лет назад · 0
guest-vm ответил 10 лет назад
G 2 940
0
Принятый ответ

This turned out to be a combination of problems. (echo true & echo true2) (I edited that mistake out of my question since it wasn't relevant to what I really wanted to know) actually outputs the following on a Windows machine:

true \r\n true2\r\n 

So the first issue is that my echo commands included an extraneous space character. The second issue is that grep treats \n as the end of the line, which is explained in an answer to Why is the end-of-line $ anchor not working with the grep command? So the second problem is that I need to capture the \r character in my regular expression. Therefore, the following is what it takes to get this working:

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

Какую версию grep вы используете? Шахтные отчеты 2.5.3.

Jeff G · 10 лет назад · 0

Хм, это интересно. Я только что обновил свой Cygwin (до 2.9.0, который включает в себя grep 3.0), и я все еще наблюдаю, что $ only соответствует \ n. Работали ли вы в командной строке Cygwin или в командной строке Windows?

Jeff G · 8 лет назад · 0

Поздняя коррекция: echo true | найти" true " совпадения, (echo true) | найти" true " совпадения. Совет для других читателей: Windows cmd - это FUBAR.

guest-vm · 8 лет назад · 0

Также я ошибся в \ r \ n, сопоставленном с$, поскольку grep, похоже, удаляет все \ r из ввода.

guest-vm · 8 лет назад · 0
Jeff G ответил 10 лет назад
J 168