Intereting Posts
не может прокручиваться назад в консоли (tty1) Команда терминала для отключения функции доступности ключей мыши Замещать содержимое папки без включения самой папки Почему я получаю “ошибку монтирования (1): операция не разрешена” на “mount.cifs” в контейнере Proxmox LXC? Фильтруйте текст ниже с помощью команд оболочки Обновление драйвера e1000 с интерфейсами rfkill unblock bluetooth отключается tftpd работает как root, несмотря на явный вариант "–user tftp" Как изменить путь установки моего исходного дерева Linux? Присоединить (большие) файлы по алфавитно-цифровому шаблону Как преобразовать беззнаковое десятичное число (менее 1 << 32) в 4 байта (двоичное) в bash? Домен Google переадресовывается на Linux-сервер Digital Ocean с подпапкой Apache2 и отображает домен как root Как запустить команду при входе в GNOME? используя команду scp для передачи файлов, сохраняющих одни и те же имена? После установки Debian, как добавить записи Grub для новых / других загрузочных дисков / установок?

Как обрабатывать файл как одну строку с помощью grep для применения шаблона поиска регулярного выражения?

Я хочу совместить все, что находится между некоторыми строками с регулярным выражением, но не так, чтобы соответствовать началу и концу. Это звучит для меня как позитивный взгляд и позитивный взгляд

start text bla bla bla end 

Существует несколько таких блоков, поэтому я хотел бы извлечь все эти блоки, а затем для каждого из этих блоков я хотел бы извлечь что-то, основанное на другом регулярном выражении. Так должно быть что-то вроде:

 match start then match everything until the first occurrence of end match start then match everything until the first occurrence of end 

и так далее…

поэтому я сделал что-то вроде этого: (? <= start). * (? = end)

Это не работает, потому что я предполагаю, что использую командную строку grep, которая обрабатывает файл как набор строк и пытается применить регулярное выражение в каждой отдельной строке. Есть ли способ обработать файл как целую строку, или это не очень хорошее решение, и я должен использовать комбинацию различных инструментов командной строки, таких как извлечение текста с помощью sed, а затем сборка файла, строки которого содержат конкатенацию различных строк из исходного файла?

Поскольку я избил меня до решения sed, я просто опубликую perl-эквивалент:

 perl -ne 'print if/start/../end/' 

Тем не менее, это немного более подробно.

В этом случае вы можете найти sed.

 sed -ne '/start/,/end/p' 

Альтернативное выражение sed, которое объединяет согласованные строки:

 sed -ne '/start/ba; be;' \ -e ':a; N; /end/{s/\n/ /g; p; be;}; ba' \ -e :e 

В первом разделе вывешивается метка a если строка соответствует /start/ , иначе ветвится на e (конец).

Вторая секция пересекает линии, добавляя их в пространство шаблонов до тех пор, пока не будет найдена строка, соответствующая /end/ , когда она заменяет новые строки пробелами, печатает строку и затем переходит к e (конец).

В третьем разделе представлена ​​метка e .

 echo "q" | openssl s_client -connect mail.google.com:443 -showcerts 2>/dev/null | awk '/-----BEGIN/{flag=1} /-----END/{print;flag=0} flag'