2017-01-19 14 views
2

Как я могу сопоставить строку unix, заканчивающуюся grep? У меня уже есть рабочий скрипт, который использует unix2dos и cmp, но он немного медленный, и одна команда grep будет намного лучше сочетаться с остальной частью моего кода bash.Сопоставьте строку unix, заканчивающуюся grep

Я попытался использовать отрицательный lookbehind на '\r'.

$ printf "foo\r\n" | grep -PUa '(?<!'$'\r'')$' 
foo 

Почему это не работает? Для записи, регулярное выражение шаблон кажется оценить только хорошо так:

$ printf '(?<!'$'\r'')$' | od -a 
0000000 ( ? < ! cr ) $ 
0000007 

Update:

$ grep --version 
grep (GNU grep) 2.24 

на MINGW64 на окнах 7.

+0

Если вам нужно, чтобы соответствовать новой строки не предшествуют с '\ r', просто используйте' '\ n'' –

+0

'Printf "Foo \ п" | grep -PUa '(?

+0

* Почему это не работает? * Работает для меня с 'grep (GNU grep) 2.25' – Leon

ответ

2

Ваше решение с grep -PUa '(?<!'$'\r'')$' работал с более новой версия grep (2.25). Однако считается, что поддержка Perl-совместимого регулярного выражения (-P) является очень экспериментальной даже в этой более новой версии grep, поэтому неудивительно, что она не работала в предыдущей версии.

Используйте следующие основные регулярные выражения: \([^\r]\|^\)$, т.е. следующей grep команды при работе с bash:

grep -Ua '\([^'$'\r'']\|^\)$' 

Пример демонстрирует, что он правильно обрабатывает как пустые и непустые строки:

$ printf "foo\nbar\r\n\nx\n\r\ny\nbaz\n" | grep -Ua '\([^'$'\r'']\|^\)$' 
foo 

x 
y 
baz 
$ 

EDIT

Солу выше обрабатывает последнюю строку , не включая символ конца строки, как если бы он заканчивался окончанием строки unix. Например.

$ printf "foo\nbar" | grep -Ua '\([^'$'\r'']\|^\)$' 
foo 
bar 

Это может быть исправлено путем добавления искусственного CRLF на вход - если вход заканчивается символом новой строки, то дополнительная (пустая) строка будет сброшена на grep, в противном случае он будет делать grep падение последнего линия: (?

$ { printf "foo\nbar"; printf "\r\n"; } | grep -Ua '\([^'$'\r'']\|^\)$' 
foo 
$ 
+0

Это не работает, когда есть текст, но нет окончаний строки: он по-прежнему будет совпадать, даже если нет окончаний строки UNIX –

+0

@ChieltenBrinke См. Обновленный ответ – Leon