Выражение grep в Linux перестает соответствовать, пока не будет найден символ возврата каретки Windows - PullRequest
0 голосов
/ 05 июля 2018

Кто-нибудь знает команду оболочки (egrep, grep), чтобы найти совпадение по нескольким строкам?

Вот часть моих данных:

/id D4333F9F; Fri, 23 Mar 2018 16:12:13 -0300 (-03)^M
Subject: =?UTF-8?Q?(Observado)=20[Chamado=202223936]=20-=20?=  =?UTF-8?Q?> Configura=C3=A7=C3=A3o=20DNS?=^M
Date: Fri, 23 Mar 2018 16:12:13 -0300^M
Content-Type: text/html; charset=UTF-8^M
Content-Transfer-Encoding: quoted-printable^M
Content-Disposition: inline^M
MIME-Version: 1.0^M

Здесь, в моем bash, я попытался найти выражение: `

/id D4333F9F.*

(обратите внимание на регулярное выражение .* , чтобы выделить все до конца файла )

Команда, вставленная в окно, имитирует команду grep, но мой поиск остановился на ^M символ

Я бы хотел продолжить поиск до MIME-Version заголовка письма (это файл Thunderbird).

1 Ответ

0 голосов
/ 05 июля 2018

Для упрощения, давайте рассмотрим этот файл:

$ cat file
before
/id D4333F9F 1234
another line
last line in file

Проблема, с которой вы сталкиваетесь, не ^M. Это то, что стандарт grep обрабатывает только одну строку за раз.

Использование sed

Чтобы получить все от строки, содержащей /id D4333F9F, до конца файла, есть несколько стандартных инструментов, которые вы можете использовать. Например, попробуйте sed:

$ sed -n '/\/id D4333F9F/,$ p' file
/id D4333F9F 1234
another line
last line in file

Здесь /\/id D4333F9F/,$ p указывает sed печатать любые строки, начиная со строки, совпадающей с /id D4333F9F и заканчивая последней строкой ($).

Использование awk

Попробуйте awk:

$ awk '/\/id D4333F9F/{f=1} f' file
/id D4333F9F 1234
another line
last line in file

Здесь /\/id D4333F9F/{f=1} указывает awk установить переменную f равной единице, когда найдена первая строка, соответствующая /id D4333F9F. Последний f является сокращением, которое указывает awk на печать, если f истинно (что означает непустое или ненулевое значение).

Использование grep с расширениями GNU

Наконец, если ваш grep имеет расширение -P (для этого требуется GNU grep), попробуйте:

$ grep -ozP '(?s)/id D4333F9F.*' file
/id D4333F9F 1234
another line
last line in file

Этот grep-код подробно объясняется здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...