Как использовать регулярное выражение в конце строки в Windows? - PullRequest
9 голосов
/ 09 июня 2011

У меня есть файл .txt, созданный в Windows, и теперь должен редактироваться в Linux. Я хочу сопоставить конец строки с grep, скажем, содержимое строки, которую я собираюсь найти, это "foo bar" в файле bar. Затем я выдаю команду grep 'r$' bar, выход не выдан.

В Windows новая строка состоит из '\ r \ n', отличного от Linux / Unix одним '\ n', я думаю, что с этим должно быть что-то тонкое. Затем я конвертирую файл с dos2unix и вуаля, все работает.

У меня вопрос: как сопоставить содержимое, не преобразовав исходный файл?

Любой совет будет высоко оценен.

Спасибо и наилучшими пожеланиями.

Ответы [ 4 ]

7 голосов
/ 09 июня 2011

Если ваш grep поддерживает -P (perl-regexp), то для соответствия CRLF:

grep -P '\r$' file

или

grep Ctrl + V Ctrl + M file

( Ctrl + V Ctrl + M произведет ^M)

6 голосов
/ 09 июня 2011

Использовать шаблон с совпадениями на обоих концах строки: r\r?\n

0 голосов
/ 02 февраля 2019

У меня была похожая проблема в подсистеме Windows для Linux (WSL), работающей в GNU bash (v4.3.48) в Ubuntu. Ни одно из предложенных выше предложений не сработало для меня, но сработало следующее (спасибо @phuclv за подсказку за использование \015 вместо Ctrl + V Ctrl + M ).

grep -Prno "TOKEN[^\015\012]*" *

Я хотел сравнить с TOKEN до конца строки и получал пустые места. Поэтому я попытался сопоставить все возвраты без каретки (\015) и без перевода строки (\012) после TOKEN.

0 голосов
/ 08 февраля 2014

попробуй awk

awk '/r$/' RS='\r\n' bar

или

awk '/r\r$/' bar
...